我最近创建了一个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应用程序。每个服务请求都应该有自己的数据库上下文。
答案 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);
是非常正确的。