如何在 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&lt;T&gt; 泛型注册一个或多个装饰器。 它在上面的 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&lt;MyBindingGenerator&gt;() 语法而不是.BindAllInterfaces() 的单个基于约定的绑定

【讨论】:

以上是关于如何在 Ninject 中装饰实现特定接口的所有绑定的主要内容,如果未能解决你的问题,请参考以下文章

8.Python中装饰器是什么?

如何在 Spring(Boot)中装饰 REST 响应?

python中装饰器的原理

Flask-RESTful中装饰器的使用

在 SwiftUI 中装饰文本片段的最佳方法是啥?

python中装饰器修复技术