我最近創建了一個WCF服務庫。我正計劃在IIS中託管它。由於我想重用我的存儲庫層,我決定在我的WCF服務中使用Ninject(我在解決方案中的其他項目中使用它)。使用WCF服務的Ninject Di綁定
我安裝了Ninject Wcf Extensions。我使用svc文件中的NinjectServiceHostFactory對其進行了配置。我添加了一個Global.asax文件來覆蓋從NinjectWcfApplication繼承的CreateKernel(),但我不確定是否正確使用了綁定。我第一次開始:
Bind<IUnitOfWork>().To<UnitOfWork>().InRequestScope();
但我很快意識到,這是行不通的,因爲沒有數據保存到我的數據庫。看起來WCF服務不使用ASP.NET管道。我繼續前進,並嘗試這兩個以及以查看我的數據是否承諾到數據庫:
Bind<IUnitOfWork>().To<UnitOfWork>().InThreadScope();
Bind<IUnitOfWork>().To<UnitOfWork>().InTransientScope();
沒有運氣。於是我決定嘗試:
Bind<IUnitOfWork>().To<UnitOfWork>().InSingletonScope();
這個工作,但我不希望我的數據庫上下文由涉及到WCF服務的每一個請求共享。然後,我做了一些研究,發現了以下方法:
Bind<IUnitOfWork>().To<UnitOfWork>().InScope(c => OperationContext.Current);
這有效,但它是正確的?我想要一些類似於MVC應用程序的InRequestScope。對服務的每個請求都應該有自己的數據庫上下文。
謝謝雷莫,我會看看。但假設我只想使用Ninject和Ninject.Extensions.Wcf,OperationContext.Current就是你建議用作範圍的東西。特別是如果我想將WCF服務移動到一個非IIS主機下。 – Thomas
可能你錯過了。無論如何,如果你想使用最新版本的Ninject,你將不得不這樣做。即使自己託管,Web.cmmon也是wcf擴展所需的依賴項。 –