2017-07-26 37 views
2

通用接口Ninject你可以註冊一個這樣的綁定:查找類,它實現與Ninject

Bind(typeof(IQueryHandler<,>)).To(typeof(QueryHandler<,>)); 

但在我的情況下,我不知道實際的類的名稱。我所知道的是它實現了一個特定的接口。

因此,舉例來說,假設我有以下幾點:

public class CreatePageQueryHandler : IQueryHandler<CreatePage, string> 
{ 
    public string Retrieve(CreatePage query) 
    { ... } 
} 

將只有一個類實現這些gerenic PARAMS接口:IQueryHandler<CreatePage, string>

是否與Ninject的方式來動態獲取類的一個實例?喜歡的東西:

kernel.Get<IQueryHandler<CreatePage, string>>(); // returns instance of: CreatePageQueryHandler 

請注意:

我不手動bind這在RegisterServices方法想。我正在尋找一種動態的方式來獲得課程的實例。

回答

1

使用此代碼,您將獲得實現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的核心是有不同的方式從程序集中獲取所有類型

+0

事情變得更加複雜一點時,有沒有非通用'IQueryHandler'。在這個問題中,似乎只有一個通用的'IQueryHandler <,>'接口。 – Steven

3

Ninject包含一個批註冊API。您可以使用以下綁定,例如:

kernel.Bind(
    x => x.FromAssembliesMatching("Fully.Qualified.AssemblyName*") 
    .SelectAllClasses() 
    .InheritedFrom(typeof(IQueryHandler<,>)) 
    .BindBase() 
); 
+0

我已經安裝了'Ninject.Extensions.Conventions'。但「綁定」方法仍然不接受lamda。我還需要什麼嗎? – w00

+0

tbh,我不知道。我從[這個答案]複製了示例(https://stackoverflow.com/a/40284170/264697)。 – Steven