使用Ninject依赖创建器和事件代理进行生命周期管理



我在一个相当大的项目中使用Ninject,并希望利用依赖创建和事件代理扩展。

依赖创建自述给出了以下示例(尽管我认为InCreatorScope现在可能已重命名为InDependencyCreatorScope)

this.kernel.Bind<IParent>().To<Parent>();
this.kernel.DefineDependency<IParent, Dependency>();
this.kernel.Bind<Dependency>().ToSelf().InCreatorScope();

这个例子通过容器在ParentDependency之间创建了一个依赖关系,而它们之间没有"硬"引用。这促进了组件之间的松耦合,并允许我使用Event Broker在Parent上发布事件并在Dependency上订阅它,而无需显式地连接事件处理程序。

我的问题是:如果Dependency被注入到其他对象中,我希望它具有RequestScope的标准激活生命周期,该怎么办?

我如何声明我想在标准激活时使用请求作用域,而在与Parent一起创建时使用依赖创建者作用域?

你可以使用条件绑定:

// 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重载注册创建的对象,这使得它比创建复杂的作用域更容易。

最新更新