我在一个相当大的项目中使用Ninject,并希望利用依赖创建和事件代理扩展。
依赖创建自述给出了以下示例(尽管我认为InCreatorScope
现在可能已重命名为InDependencyCreatorScope
)
this.kernel.Bind<IParent>().To<Parent>();
this.kernel.DefineDependency<IParent, Dependency>();
this.kernel.Bind<Dependency>().ToSelf().InCreatorScope();
这个例子通过容器在Parent
和Dependency
之间创建了一个依赖关系,而它们之间没有"硬"引用。这促进了组件之间的松耦合,并允许我使用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
重载注册创建的对象,这使得它比创建复杂的作用域更容易。