使用WCF服务的Ninject Di绑定

时间:2011-10-11 16:59:56

标签: wcf ninject ninject-extensions

我最近创建了一个WCF服务库。我打算在IIS中托管它。由于我想重用我的存储库层,我决定在我的WCF服务中使用Ninject(我在解决方案中的其他项目中使用它)。

我安装了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);

这有效但是它是否正确?我想要一些类似于InRequestScope的MVC应用程序。每个服务请求都应该有自己的数据库上下文。

2 个答案:

答案 0 :(得分:3)

我建议您查看CI-Server http://teamcity.codebetter.com

中的最新版本

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

使用此版本,您可以使用InRequestScope for Wcf。

答案 1 :(得分:1)

我是Ninject的新手,但我可以告诉你,OperationContext.Current相当于网络应用程序的HttpContext.Current

所以你的第一个想法是使用.InRequestScope();(相当于.InScope(c => HttpContext.Current);

所以我想对WCF使用.InScope(c => OperationContext.Current);是非常正确的。