2011-03-30 50 views
3

以下是方案。我有一個WCF服務,當這個服務被調用時,它將控制權傳遞給另一個類的實例(通過Ninject創建)。在那個類中,我需要做一些工作,特別是實體框架和存儲庫。簡而言之,我已經聲明瞭以下綁定。Ninject不在WCF中使用構造函數參數創建新實例

Bind<IGenericProductRepository>() 
    .To<GenericProductRepository>() 
    .WithConstructorArgument("context", new StagingDataContext()); 

當我想要使用這個存儲庫我有以下。

using (var genericProductRepository = IoC.Resolve<IGenericProductRepository>()) 

的問題是,我只得到genericProductRepository的新實例,如果它是一個全新的請求時,如果該方法是在相同的請求多次調用我得到一個錯誤,指出上下文(EF上下文)已經處理完畢,這是因爲它看起來像我得到了已經在using語句中處理的相同實例。用另一種方式解釋它,使用Microsoft WCF Test Client,如果我第一次調用它,代碼運行良好,如果再次推送調用按鈕(不重新啓動測試客戶端,即相同的請求),則會引發此錯誤關於它已被處置。

我嘗試過使用Ninject附帶的各種「範圍」,但顯然我錯過了一些東西。

所以我的基本問題是,如何獲得一個新的存儲庫,只要它擊中該行,而不是使用同一個?幫助將不勝感激,我真的試圖推動我的公司採用Ninject並放棄春季。

回答

3

再次看看你的綁定。即使沒有關於Ninject的任何知識,您應該注意到,在定義綁定時,您的上下文實例只創建一次。但是,你想要的是每個決心都有一個新的背景。最好通過不使用WithConstructorArgument並讓Ninject創建實例來完成。因此你必須爲上下文的類型定義一個額外的綁定。如果這是不可能因爲某些原因,你必須使用WithConstructorArgument的懶惰版本

WithConstructorArgument("context", ctx => new StagingDataContext()) 

此外,你可能想嘗試Ninject的WCF擴展: https://github.com/ninject/ninject.extensions.wcf

這樣,你可以擺脫ServiceLocator就像用法一樣。

相關問題