C# 如何使用Ninject扫描泛型类型的所有实现

C# 如何使用Ninject扫描泛型类型的所有实现,c#,ninject,C#,Ninject,我们使用域事件模式,并依靠IoC容器来定位特定类型事件的处理程序: public interface IHandleEvent<TEvent> where TEvent : IEvent { void Handle(TEvent evnt); } 公共接口IHandleEvent,其中TEvent:IEvent { 无效手柄(TEvent evnt); } 使用StructureMap,我们可以扫描和注册实现上述接口的所有类型,如下所示: Scan(cfg => {

我们使用域事件模式,并依靠IoC容器来定位特定类型事件的处理程序:

public interface IHandleEvent<TEvent> where TEvent : IEvent
{
    void Handle(TEvent evnt);
}
公共接口IHandleEvent,其中TEvent:IEvent
{
无效手柄(TEvent evnt);
}
使用StructureMap,我们可以扫描和注册实现上述接口的所有类型,如下所示:

Scan(cfg =>
{
    cfg.TheCallingAssembly();
    cfg.ConnectImplementationsToTypesClosing(typeof(IHandleEvent<>));
});
Scan(cfg=>
{
cfg.卡套总成();
cfg.与类型闭合的连接实现(类型(IHandleEvent));
});
Ninject是否有一个等价物

目前,我必须单独绑定每个处理程序,如下所示:

kernel.Bind<IHandleEvent<SomeEvent>>().To<EventHandler1>();
kernel.Bind<IHandleEvent<SomeEvent>>().To<EventHandler2>();
kernel.Bind<IHandleEvent<SomeOtherEvent>>().To<EventHandler3>();
kernel.Bind().To();
kernel.Bind().To();
kernel.Bind().To();
试试看。
它按照约定为Ninject提供配置。wiki中有相当好的文档。

Ninject Conventions Extensions包正是我所需要的。工作代码如下:

kernel.Bind(x => x
    .FromThisAssembly()
    .SelectAllClasses().InheritedFrom(typeof(IHandleEvent<>))
    .BindSingleInterface());
kernel.Bind(x=>x
.FromThisAssembly()中的
.SelectAllClasses().InheritedFrom(typeof(IHandleEvent))
.BindSingleInterface());

谢谢!那是为了我。顺便说一句,你的博客帮了我很多。