繁体   English   中英

IIS中托管的WCF服务中的DbContext生命周期

[英]DbContext Lifecycle In WCF Service Hosted In IIS

我已经使用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))的注册来处理的。 ():

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

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

任何见识将不胜感激。

从Ninject专家那里收到了以下信息:

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM