我们使用域事件模式并依靠我们的IoC容器来定位特定类型事件的处理程序:
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)
Ninject Conventions Extensions包完全符合我的需要.工作代码如下:
kernel.Bind(x => x
.FromThisAssembly()
.SelectAllClasses().InheritedFrom(typeof(IHandleEvent<>))
.BindSingleInterface());
Run Code Online (Sandbox Code Playgroud)