3

我最近创建了一个 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 的东西。对服务的每个请求都应该有自己的数据库上下文。

4

2 回答 2

3

我建议看看 CI-Server http://teamcity.codebetter.com的最新版本

您需要 Ninject、Ninject.Web.Common、Ninject.Extensions.Wcf

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

于 2011-10-12T15:42:19.530 回答
1

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

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

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

于 2011-10-12T12:45:32.603 回答