[英]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.