如何在 Ninject 中装饰实现特定接口的所有绑定
Posted
技术标签:
【中文标题】如何在 Ninject 中装饰实现特定接口的所有绑定【英文标题】:How can I decorate all my bindings implementing a specific interface in Ninject 【发布时间】:2015-03-08 05:03:39 【问题描述】:我正在使用 Jimmy Bogard 的 Mediatr 并尝试使用管道示例 here
我的问题是,虽然我可以像这样得到所有关闭的泛型类型
kernel.Bind(
x =>
x.FromAssemblyContaining<ExpensiveRequest>()
.SelectAllClasses()
.InheritedFrom(typeof (IRequestHandler<,>)).BindAllInterfaces()
我不能用 MediatorPipeline 来装饰它们。
所以如果我使用的是 StructureMap,我可以使用类似的东西
cfg.For(typeof(IRequestHandler<,>)).DecorateAllWith(typeof(MediatorPipeline<,>));
我找不到如何使用 Ninject 实现它,因此当我的 Mediator 被调用时,它会使用 Mediator 管道,然后再使用原始处理程序
【问题讨论】:
关心自己发布您的答案吗? github.com/MrKevHunter/RedisMediatorClient 您找到解决方案了吗?我想知道如何为cuttingedge.it/blogs/steven/pivot/entry.php?id=91 这样的模式执行此操作,我希望能够为我的ICommandHandler<T>
泛型注册一个或多个装饰器。
它在上面的 github 仓库中
【参考方案1】:
有几种方法可以做到这一点。您可以执行您已经在执行的基于约定的扫描,并在其末尾添加上下文绑定:
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()
的单个基于约定的绑定
【讨论】:
以上是关于如何在 Ninject 中装饰实现特定接口的所有绑定的主要内容,如果未能解决你的问题,请参考以下文章