2011-10-11 52 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应用程序等场景不同的背景)。 –