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

时间:2013-10-16 14:09:46

标签: c# wcf iis ninject

我一直在使用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);

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

非常感谢任何见解。

1 个答案:

答案 0 :(得分:1)

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

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

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