簡體   English   中英

查找使用Ninject實現通用接口的類

[英]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約定擴展。

參見https://github.com/ninject/Ninject.Extensions.Conventions

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM