2011-10-11 108 views
3

我最近創建了一個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。對服務的每個請求都應該有自己的數據庫上下文。

回答

3

我建議看看從CI-服務器http://teamcity.codebetter.com

你需要Ninject,Ninject.Web.Common,Ninject.Extensions.Wcf

在這個版本中,你可以使用InRequestScope最新版本爲Wcf。

+0

謝謝雷莫,我會看看。但假設我只想使用Ninject和Ninject.Extensions.Wcf,OperationContext.Current就是你建議用作範圍的東西。特別是如果我想將WCF服務移動到一個非IIS主機下。 – Thomas

+0

可能你錯過了。無論如何,如果你想使用最新版本的Ninject,你將不得不這樣做。即使自己託管,Web.cmmon也是wcf擴展所需的依賴項。 –

1

我是Ninject的新手,但我可以告訴你OperationContext.Current相當於HttpContext.Current的Web應用程序。

所以,你首先想到的是用.InRequestScope();(這相當於.InScope(c => HttpContext.Current);

,所以我想,使用.InScope(c => OperationContext.Current);爲WCF是相當正確的。

+1

這並沒有什麼不對,只是想指出在WCF中也有一個模式,它在捎帶到一個'HttpContext.Current',雖然通常'OperationContext.Current'是正確的。請注意,@Remo Gloor的建議是將這些東西包裝起來的方式,不管你是否告訴WCF創建一個HttpContext(而不是完全維護兩個對象),乾淨地處理混合WCF/Web應用程序等場景不同的背景)。 –