如何在Ninject中修饰实现特定接口的所有绑定

时间:2015-01-09 19:39:59

标签: ninject mediatr

我使用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

1 个答案:

答案 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}}

的单个基于约定的绑定