1

我使用 Ninject 已经有一段时间了,很喜欢它给我的代码带来的东西,但我遇到了一个小难题,不确定是否存在问题,或者我是否想多了。

场景:在 IIS 中托管的 WCF 服务应用程序。EF6 RC1 作为 ORM,将 DbContext 派生类注入到我的数据库中的数据库类中。使用 JustMock (Telerik) 执行我所有的单元测试,模拟注入到 db 类中的 dbcontext 以执行那些特定的单元测试。

添加

kernel.Bind<MyContext>().ToSelf().InRequestScope(); 

根据http://www.davepaquette.com/archive/2013/03/27/managing-entity-framework-dbcontext-lifetime-in-asp-net-mvc.aspx到我的 Ninject 模块。

WCF服务的服务行为是:

InstanceContextMode = InstanceContextMode.PerSession, ConcurrencyMode = ConcurrencyMode.Multiple, UseSynchronizationContext = false

Per Dave Paquette 的文章是为 MVC4 而不是 WCF 编写的,生命周期是通过注册 OnePerRequestHttpModule (DynamicModuleUtility.RegisterModule(typeof(OnePerRequestHttpModule)) 来处理的。当我添加 Ninject WCF nuget 包时,在 Start 中添加了以下内容():

DynamicModuleUtility.RegisterModule(typeof(OnePerRequestHttpModule));
        DynamicModuleUtility.RegisterModule(typeof(NinjectHttpModule));
        bootstrapper.Initialize(CreateKernel);

我的问题是:鉴于 WCF 服务公开了命名管道和 TCP 的端点(没有 HTTP 端点),我的 dbcontext 的生命周期是什么,它的上下文更多的是 PerSession,而不是 PerCall 并且它托管在 IIS 中?

任何见解将不胜感激。

4

1 回答 1

2

从忍者大师那里收到以下信息:

WCF 中 InRequestScope 的生命周期与 OperationContext.Current 相同。这意味着它是每个 WCF 调用。范围清理由 IDispatchMessageInspector 实现完成。在我的情况下,不需要 OnePerRequestHttpModule。

使用 InRequestScope 时应使用 PerCall ContextMode。否则,您的服务将在第二次调用同一会话时访问已处置的 DbContext。

于 2013-10-18T23:56:18.823 回答