2012-10-30 50 views
0

我使用Ninject 3.01.1.10與WCF extenstion和Web extention(全部來自的NuGet)Ninject在N層應用程序中使用WCF和InRequestScope

我在WCF服務(使用NInject有幾個客戶端桌面應用程序)使用實體框架和存儲庫模式。

因爲我使用EF,所以我想使用InRequestScope,以便每次存在服務請求時都會創建每個存儲庫(如EF良好實踐規定)。

我通過nuget安裝了所有東西,並將NinjectWebCommon引導程序類作爲Ninject WCF示例顯示的RegisterServices註冊服務。當我在網上閱讀時,我也有InstanceContextMode.PerCall中的WCF服務。

我的問題是:所有的注入對象鏈需要在InRequestScope中,因此作用域的作用?

我的WCF服務被注射在構造一個ServiceHandlerDispatcher:

public VanillaService(IServiceHandlerDispatcher serviceHandlerDispatcher) { ... } 

這ServiceHandlerDispatcher具有的ServiceHandler的對象的字典,根據客戶的要求處理,呼叫控制對象。此控制器對象具有使用存儲庫的方法。

public ServiceHandlerDispatcher(IMessageHandler[] messageHandlers) { ... } 

public SaveSubmissionHandler(SubmissionController submissionController) { ... } 

public SubmissionController(IRepository<Submission> submissionRepository) { ... } 

所以這個產業鏈是這樣的:服務 - > ServiceHandlerDispatcher - >的ServiceHandler - >控制 - >資料庫 - > DB

對於性能和內存的目的,我希望ServiceHandlerDispatcher和單所有的ServiceHandler範圍,但InRequestScope中的存儲庫對象(因此在每次調用中,EF的DbContext都被處置),因爲我可以有幾十個ServiceHandler對象。

再次,服務 - > ServiceHandlerDispatcher(SingletonScope) - >的ServiceHandler(SingletonScope) - >控制器(無) - >庫(InRequestScope) - > DB

這是可能的,或者我必須讓內核創建每個呼叫中​​的每個ServiceHandler? 如果需要鏈中的每個對象都需要是InRequestScope,那麼如何實現ServiceHandler字典?隨着工廠擴展?

回答

1

所以,這是不可能的。如果我在鏈中的第一個項目的範圍比其他項目更大(在本例中爲SingletonScope),那麼鏈中的其他項目也將具有該範圍。