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