[英]Find class that implements generic interface with Ninject
使用Ninject,您可以注冊如下綁定:
Bind(typeof(IQueryHandler<,>)).To(typeof(QueryHandler<,>));
但就我而言,我不知道實際班級的名稱。 我所知道的是它實現了特定的接口。
因此,例如,假設我有以下內容:
public class CreatePageQueryHandler : IQueryHandler<CreatePage, string>
{
public string Retrieve(CreatePage query)
{ ... }
}
將只有一個類使用這些gerenic參數實現該接口: IQueryHandler<CreatePage, string>
Ninject有沒有辦法動態獲取類的實例? 就像是:
kernel.Get<IQueryHandler<CreatePage, string>>(); // returns instance of: CreatePageQueryHandler
請注意:
我不想在RegisterServices
方法中手動bind
它。 我正在尋找一種獲取類實例的動態方法。
Ninject包含一個批次注冊API。 例如,您可以使用以下綁定:
kernel.Bind(
x => x.FromAssembliesMatching("Fully.Qualified.AssemblyName*")
.SelectAllClasses()
.InheritedFrom(typeof(IQueryHandler<,>))
.BindBase()
);
通過此代碼,您將獲得實現IQueryHandler的所有類型。
var types = AppDomain.CurrentDomain.GetAssemblies()
.SelectMany(s => s.GetTypes())
.Where(p => typeof(IQueryHandler).IsAssignableFrom(p));
之后,您可以在Ninject中注冊類型,也可以從以下類型之一手動創建實例:
var instance = (IQueryHandler)Activator.CreateInstance(types.First());
我沒有測試此代碼,在.Net Core上,有一種從裝配中獲取所有類型的方法
我認為您需要Ninject約定擴展。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.