2013-10-16 115 views
1

我一直在使用Ninject一段时间,并且爱它带给我的代码,但我遇到了一个小小的困境,我不确定是否有问题,或者如果我超越它。DbContext生命周期在WCF服务托管在IIS中

场景:在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 

每戴夫·帕克特的文章,这是为MVC4,不WCF写的,生命周期是通过OnePerRequestHttpModule登记(DynamicModuleUtility.RegisterModule(typeof运算处理( 。OnePerRequestHttpModule))当我添加了Ninject WCF NuGet包,添加下列启动():

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

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

任何有识之士将不胜感激。

回答

1

接收到来自Ninject大师以下信息:

InRequestScope在WCF的寿命是一样OperationContext.Current。这意味着它是每个WCF呼叫。范围清理由IDispatchMessageInspector实现完成。 OnePerRequestHttpModule在我的情况下不是必需的。

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

+1

你在哪里设置PerCall ContextMode?谢谢! – CesarD

+0

[本文](http://www.codeproject.com/Articles/86007/ways-to-do-WCF-instance-management-Per-call-Per)演示如何设置上下文模式。将上下文模式设置为PerCall可以解决我在使用Ninject WCF扩展时遇到了错误“操作无法完成,因为DbContext已经处理完毕”(我只是在它工作之前做了一次清理/重建)的问题。 – dtryan