我一直在使用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中托管?
非常感谢任何见解。
答案 0 :(得分:1)
从Ninject大师那里收到以下信息:
WCF中InRequestScope的生命周期与OperationContext.Current相同。这意味着它是每个WCF调用。范围清理由IDispatchMessageInspector实现完成。在我的情况下,不需要OnePerRequestHttpModule。
使用InRequestScope时应使用PerCall ContextMode。否则,您的服务将在第二次调用同一会话时访问已处置的DbContext。