C# 使用Ninject依赖项创建者和事件代理进行生存期管理

C# 使用Ninject依赖项创建者和事件代理进行生存期管理,c#,asp.net-mvc-3,ninject,ninject.web.mvc,ninject-extensions,C#,Asp.net Mvc 3,Ninject,Ninject.web.mvc,Ninject Extensions,我在一个相当大的项目中使用Ninject,希望利用和事件代理扩展 依赖项创建自述文件给出了以下示例(尽管我认为InCreatorScope现在可能已重命名为InDependencyCreatorScope) this.kernel.Bind().To(); this.kernel.definedependence(); this.kernel.Bind().ToSelf().InCreatorScope(); 本例通过父项和依赖项之间的容器创建了依赖项,而它们之间没有“硬”引用。这促进了组件之

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

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

this.kernel.Bind().To();
this.kernel.definedependence();
this.kernel.Bind().ToSelf().InCreatorScope();
本例通过
父项
依赖项
之间的容器创建了依赖项,而它们之间没有“硬”引用。这促进了组件之间的松散耦合,并允许我使用事件代理在
父级
上发布事件,并在
依赖项
上订阅事件,而无需显式连接事件处理程序


我的问题是:如果
依赖项
被注入到其他对象中,并且我希望它具有标准激活的
RequestScope
生存期,该怎么办?如何声明我希望使用标准激活的请求范围,但在与父项一起创建时使用依赖项创建者范围?

您可以使用条件绑定:

// 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();
//与以前一样定义依赖项
this.kernel.Bind().ToSelf().When(r=>r.Parameters.OfType().Any()).InDependencyCreatorScope();
this.kernel.Bind().ToSelf().When(r=>!r.Parameters.OfType().Any()).InRequestScope();

但通常,当您有一个基于事件代理的解决方案时,您只需在事件代理中使用
OnActivation
重载注册创建的对象,这比创建复杂的作用域更容易。

嗨,Daniel,谢谢,我正在考虑这样做。我真正想做的是确保我的发布者和订阅者之间存在一对一的关系。我启动了多个订阅处理程序,但我无法确定如何确保事件代理的作用域仅限于父级和依赖项之间,而不是任何其他可能在对象图中进一步注入的依赖项对象。
// 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();