[英]Binding mediator (shortbus) with/to ninject
我试图将调解器模式用于shortbus( https://github.com/mhinze/ShortBus )。 除了将其绑定到ninject之外,一切都进行得很好。 有一个这样的structuremap示例
public BasicExample()
{
ObjectFactory.Initialize(i =>
{
i.Scan(s =>
{
s.AssemblyContainingType<IMediator>();
s.TheCallingAssembly();
s.WithDefaultConventions();
s.AddAllTypesOf((typeof(IRequestHandler<,>)));
s.AddAllTypesOf(typeof(INotificationHandler<>));
});
i.For<IDependencyResolver>().Use(() => DependencyResolver.Current);
});
ShortBus.DependencyResolver.SetResolver(new StructureMapDependencyResolver(ObjectFactory.Container));
}
以上是单元测试。 我也希望能够进行单元测试,但最重要的是,我只希望它与整个项目一起工作。
有一个NinjectDependencyResolver,它应该与ninject一起工作。 我只是知道ninject很难做到这一点。
我将Ninject MVC与NinjectWebCommon一起使用。 上面的代码应该适用于Structuremap,所以我只需要Ninject的等效代码即可。
Ninject的工作方式略有不同。 对于IRequestHandler<,>
和INotificationHandler<>
类型绑定,应使用ninject.extensions.conventions并执行以下操作:
var kernel = new StandardKernel();
kernel.Bind(x => x.FromThisAssembly()
.SelectAllClasses()
.InheritedFromAny(
new[]
{
typeof(ICommandHandler<>),
typeof(IQueryHandler<,>)
})
.BindDefaultInterfaces());
kernel.Bind<IDependencyResolver>().ToMethod(x => DependencyResolver.Current);
ShortBus.DependencyResolver.SetResolver(new NinjectDependencyResolver(kernel));
您可能需要调整以下内容:
FromThisAssembly()
->这意味着仅绑定您编写该行的程序集类型。 您可以使用另一种机制,在其中指定在哪些程序集中查找ICommandHandler<>
和IQueryHandler<,>
类型。 BindDefaultInterfaces()
:有关说明和替代方法,请参见此处 。 还要注意,我的示例代码基于ShortBus.Ninject 3.0.48-Beta 。 最新的ShortBus 稳定版本正在引用StructureMap。
编辑:我看到你标记了问题asp.net
。 与其使用StructureMap.Ninject
及其NinjectDependencyResolver
,不如使用Ninject.Web.Common (确保它是最新版本!)和NinjectDependencyResolver
的NinjectDependencyResolver更好 。
为了完整性...别忘了绑定您的IMediator
kernel.Bind<IMediator>().To<Mediator>();
还值得注意的是,如果使用BindDefaultInterfaces(),则无法命名处理程序,但是您很喜欢。 请参阅BatteryBackupUnit发布的链接。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.