我最近创建了一个 WCF 服务库。我计划在 IIS 中托管它。因为我想重用我的存储库层,所以我决定在我的 WCF 服务中也使用 Ninject(我在解决方案的其他项目中使用它)。
我安装了 Ninject Wcf 扩展。我使用 svc 文件中的 NinjectServiceHostFactory 对其进行了配置。我添加了一个 Global.asax 文件来覆盖从 NinjectWcfApplication 继承的 CreateKernel(),但我不确定我是否正确使用了绑定(bind)。我首先开始于:
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 的东西。对服务的每个请求都应该获得自己的数据库上下文。
最佳答案
我建议查看 CI-Server http://teamcity.codebetter.com 的最新版本
你需要 Ninject、Ninject.Web.Common、Ninject.Extensions.Wcf
在此版本中,您可以将 InRequestScope 用于 Wcf。
关于wcf - 使用 WCF 服务 Ninject Di 绑定(bind),我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/7729695/