3

我在一個相當大的項目中使用Ninject,並且想要利用Dependency Creation和Event Broker擴展。Ninject依賴創建者和事件代理的生命週期管理

依賴創作自述給出了下面的例子(儘管我相信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生命週期的標準激活?如何在與Parent並行創建時聲明我希望使用請求範圍進行標準激活,而使用依賴項創建者範圍?

回答

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超載註冊創建的對象。

+0

嗨丹尼爾,謝謝我正在做這樣的事情。我真正想要做的是確保我的發佈者和訂閱者之間存在一對一的關係。我有多個訂閱處理程序觸發,我無法確定如何確保事件代理僅在父對象和依賴關係之間作用域,而不是其他任何可能在對象圖中向下注入的其他依賴對象。 – nukefusion