我使用Jimmy Bogard的Mediatr并尝试使用pipleine示例here
我的问题是虽然我可以得到所有关闭的泛型类型,如此
kernel.Bind(
x =>
x.FromAssemblyContaining<ExpensiveRequest>()
.SelectAllClasses()
.InheritedFrom(typeof (IRequestHandler<,>)).BindAllInterfaces()
我无法使用MediatorPipeline装饰它们。
因此,如果我使用的是StructureMap,我可以使用类似这样的东西
cfg.For(typeof(IRequestHandler<,>)).DecorateAllWith(typeof(MediatorPipeline<,>));
我无法找到如何使用Ninject实现它,以便在调用我的Mediator时它使用Mediator管道,然后使用原始Handler
答案 0 :(得分:2)
有很多方法可以做到这一点。您可以执行已经在进行的基于约定的扫描,并在其末尾添加上下文绑定:
kernel.Bind(x => x.FromAssemblyContaining<ExpensiveRequest>()
.SelectAllClasses()
.InheritedFrom(typeof(IRequestHandler<,>))
.BindAllInterfaces();
.Configure(c => c.WhenInjectedExactlyInto(typeof(MediatorPipeline<,>));
然后再次执行相同的操作,不用 WhenInjectedExactlyInto
上下文过滤器:
kernel.Bind(x => x.FromAssemblyContaining<ExpensiveRequest>()
.SelectAllClasses()
.InheritedFrom(typeof(IRequestHandler<,>))
.BindAllInterfaces();
这需要进行两次装配扫描。
另一种方法是编写IBindingGenerator,并在那里执行多个绑定 - 一个带有WhenInjectedExactlyInto
而另一个带有.BindWith<MyBindingGenerator>()
。这将只需要使用.BindAllInterfaces()
语法而不是{{1}}