我在一个相当大的项目中使用Ninject,并希望使用Dependency Creation和Event Broker扩展。
依赖关系创建自述文件给出了以下示例(尽管我认为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
旁边创建标准激活请求范围,但依赖创建者范围?
答案 0 :(得分:2)
您可以使用条件绑定:
// 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
重载,这样就可以更轻松地创建复杂的范围。