我最近创建了一个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扩展所需的依赖项。 –