我们正在使用域事件模式并依靠我们的IoC容器来查找特定类型事件的处理程序:
public interface IHandleEvent<TEvent> where TEvent : IEvent
{
void Handle(TEvent evnt);
}
使用StructureMap,我们可以扫描并注册实现上述接口的所有类型,如下所示:
Scan(cfg =>
{
cfg.TheCallingAssembly();
cfg.ConnectImplementationsToTypesClosing(typeof(IHandleEvent<>));
});
是否与Ninject等效?
目前我不得不单独绑定每个处理程序:
kernel.Bind<IHandleEvent<SomeEvent>>().To<EventHandler1>();
kernel.Bind<IHandleEvent<SomeEvent>>().To<EventHandler2>();
kernel.Bind<IHandleEvent<SomeOtherEvent>>().To<EventHandler3>();
答案 0 :(得分:6)
Ninject Conventions Extensions包完全符合我的要求。工作代码如下:
kernel.Bind(x => x
.FromThisAssembly()
.SelectAllClasses().InheritedFrom(typeof(IHandleEvent<>))
.BindSingleInterface());
答案 1 :(得分:5)
试试Ninject Conventions Extensions。 它按照惯例为Ninject提供配置。维基上有很好的文档。