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

Ben*_*ter 5 c# ninject

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

public interface IHandleEvent<TEvent> where TEvent : IEvent
{
    void Handle(TEvent evnt);
}
Run Code Online (Sandbox Code Playgroud)

使用StructureMap,我们可以扫描并注册实现上述接口的所有类型,如下所示:

Scan(cfg =>
{
    cfg.TheCallingAssembly();
    cfg.ConnectImplementationsToTypesClosing(typeof(IHandleEvent<>));
});
Run Code Online (Sandbox Code Playgroud)

是否与Ninject相当?

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

kernel.Bind<IHandleEvent<SomeEvent>>().To<EventHandler1>();
kernel.Bind<IHandleEvent<SomeEvent>>().To<EventHandler2>();
kernel.Bind<IHandleEvent<SomeOtherEvent>>().To<EventHandler3>();
Run Code Online (Sandbox Code Playgroud)

Ben*_*ter 6

Ninject Conventions Extensions包完全符合我的需要.工作代码如下:

kernel.Bind(x => x
    .FromThisAssembly()
    .SelectAllClasses().InheritedFrom(typeof(IHandleEvent<>))
    .BindSingleInterface());
Run Code Online (Sandbox Code Playgroud)


mip*_*e34 5

试试Ninject Conventions Extensions.它按照惯例为Ninject提供配置.在wiki中有很好的文档.