我在一个相当大的项目中使用 Ninject,并希望利用 Dependency Creation和事件代理扩展。
Dependency Creation 自述文件给出了以下示例(尽管我相信 InCreatorScope
现在可能已重命名为 InDependencyCreatorScope
)
this.kernel.Bind<IParent>().To<Parent>();
this.kernel.DefineDependency<IParent, Dependency>();
this.kernel.Bind<Dependency>().ToSelf().InCreatorScope();
此示例通过 Parent
和 Dependency
之间的容器创建依赖关系,而它们彼此之间没有“硬”引用。这促进了组件之间的松散耦合,并允许我使用事件代理在 Parent
上发布事件并在 Dependency
上订阅它,而无需显式连接事件处理程序。
我的问题是:如果 Dependency
被注入(inject)到其他对象中并且我希望它具有标准激活的 RequestScope
生命周期怎么办?如何声明我想对标准激活使用请求范围,但在与 Parent
一起创建时使用依赖创建者范围?
最佳答案
您可以使用条件绑定(bind):
// dedine dependency as before
this.kernel.Bind<Dependency>().ToSelf().When(r => r.Parameters.OfType<DependencyCreationParameter>().Any()).InDependencyCreatorScope();
this.kernel.Bind<Dependency>().ToSelf().When(r => !r.Parameters.OfType<DependencyCreationParameter>().Any()).InRequestScope();
但通常当你有一个基于事件代理的解决方案时,你可以简单地在事件代理中使用 OnActivation
重载注册创建的对象,这使得创建复杂范围更容易。
关于c# - 使用 Ninject Dependency Creator 和 Event Broker 进行生命周期管理,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14346534/