C# IIS中承载的WCF服务中的DbContext生命周期

C# IIS中承载的WCF服务中的DbContext生命周期,c#,wcf,iis,ninject,C#,Wcf,Iis,Ninject,我已经使用Ninject有一段时间了,我喜欢它给我的代码带来的东西,但是我遇到了一个小难题,我不确定是否有问题,或者我是否想得太多了 场景:托管在IIS中的WCF服务应用程序。EF6 RC1作为ORM,将DbContext派生类注入到数据库中的数据库类中。使用JustMock(Telerik)执行我所有的单元测试,模拟注入db类中的dbcontext来执行那些特定的单元测试 增加 kernel.Bind<MyContext>().ToSelf().InRequestScope();

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

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

增加

kernel.Bind<MyContext>().ToSelf().InRequestScope(); 
根据Dave Paquette为MVC4而不是WCF撰写的文章,生命周期是通过注册OnePerRequestHttpModule(DynamicModuleUtility.RegisterModule(typeof(OnePerRequestHttpModule))来处理的。当我添加Ninject WCF nuget包时,在Start()中添加了以下内容:

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


任何洞察都将不胜感激。

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

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


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

从Ninject guru接收到以下信息:

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


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

您在哪里设置PerCall ContextMode?谢谢!显示了如何设置上下文模式。将上下文模式设置为PerCall修复了我获取错误的问题,操作无法完成,因为DbContext已在“使用Ninject WCF扩展时”被释放(我只需在它工作之前进行清理/重建)。您在哪里设置PerCall ContextMode?谢谢!演示了如何设置上下文模式。将上下文模式设置为PerCall修复了我获取错误的问题该操作无法完成,因为在使用Ninject WCF扩展时,DbContext已被释放(在它工作之前,我只需执行清理/重建)。
InstanceContextMode = InstanceContextMode.PerSession, ConcurrencyMode = ConcurrencyMode.Multiple, UseSynchronizationContext = false
DynamicModuleUtility.RegisterModule(typeof(OnePerRequestHttpModule));
        DynamicModuleUtility.RegisterModule(typeof(NinjectHttpModule));
        bootstrapper.Initialize(CreateKernel);