我在一个相当大的项目中使用Ninject,并且想利用Dependency Creation和Event Broker扩展。

Dependency Creation自述文件给出了以下示例(尽管我相信InCreatorScope现在可能已重命名为InDependencyCreatorScope

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


本示例通过容器在ParentDependency之间创建依赖关系,而它们之间没有相互“硬”引用。这促进了组件之间的松散耦合,并允许我使用事件代理在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重载注册创建的对象,这将使创建复杂的作用域更加容易。

关于c# - 使用Ninject Dependency Creator和Event Broker进行终身管理,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/14346534/

10-10 11:32