我最近创建了一个 WCF 服务库。我打算在 IIS 中托管它。由于我想重用我的存储库层,我决定在我的 WCF 服务中也使用 Ninject(我在解决方案的其他项目中使用它)。
我安装了 Ninject Wcf 扩展。我使用 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 的东西。对服务的每个请求都应该有自己的数据库上下文。