查找使用Ninject实现通用接口的类

时间:2017-07-26 09:52:34

标签: c# ninject ninject.web.mvc

使用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这个。我正在寻找一种动态的方法来获得该类的实例。

3 个答案:

答案 0 :(得分:3)

Ninject包含批量注册API。例如,您可以使用以下绑定:

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

答案 1 :(得分: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 Core上有一种不同的方法从程序集中获取所有类型

答案 2 :(得分:1)

我认为您需要Ninject约定扩展。

请参阅https://github.com/ninject/Ninject.Extensions.Conventions