5

我正在使用 Jimmy Bogard 的 Mediatr 并尝试在此处使用 pipleine 示例

我的问题是,尽管我可以像这样获得所有关闭的泛型类型

     kernel.Bind(
            x =>
                x.FromAssemblyContaining<ExpensiveRequest>()
                    .SelectAllClasses()
                    .InheritedFrom(typeof (IRequestHandler<,>)).BindAllInterfaces()

我不能用 MediatorPipeline 来装饰它们。

所以如果我使用 StructureMap 我可以使用这样的东西

cfg.For(typeof(IRequestHandler<,>)).DecorateAllWith(typeof(MediatorPipeline<,>));

我找不到如何使用 Ninject 实现它,因此当我的 Mediator 被调用时,它使用 Mediator 管道,然后到原始的 Handler

4

1 回答 1

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()

于 2016-01-17T22:39:48.793 回答