3

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

依赖创建自述文件给出了以下示例(尽管我相信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标准激活的生命周期怎么办?我如何声明我想使用 Request 范围进行标准激活,但在创建时使用依赖创建者范围Parent

4

1 回答 1

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重载的对象,这使得创建复杂范围更容易。

于 2013-01-16T05:32:00.760 回答