C# 使用WCF和InRequestScope在N层应用程序中创建Ninject

C# 使用WCF和InRequestScope在N层应用程序中创建Ninject,c#,wcf,entity-framework,ninject,C#,Wcf,Entity Framework,Ninject,我将Ninject 3.01.1.10与WCF扩展和Web扩展一起使用(全部来自nuget) 我正在使用实体框架和存储库模式在WCF服务(有几个客户端桌面应用程序)中使用NInject 因为我使用的是EF,所以我想使用InRequestScope,这样每次有服务请求时都会创建每个存储库(正如EF良好实践所规定的那样) 我通过nuget安装了所有东西,并让NinjectWebCommon引导程序类在RegisterServices中注册服务,如Ninject WCF示例所示。当我在网上的某个地方阅

我将Ninject 3.01.1.10与WCF扩展和Web扩展一起使用(全部来自nuget)

我正在使用实体框架和存储库模式在WCF服务(有几个客户端桌面应用程序)中使用NInject

因为我使用的是EF,所以我想使用InRequestScope,这样每次有服务请求时都会创建每个存储库(正如EF良好实践所规定的那样)

我通过nuget安装了所有东西,并让NinjectWebCommon引导程序类在RegisterServices中注册服务,如Ninject WCF示例所示。当我在网上的某个地方阅读时,我还在InstanceContextMode.PerCall中使用WCF服务

我的问题是:所有注入对象链是否都需要在InRequestScope中才能工作

我的WCF服务正在构造函数中注入ServiceHandlerDispatcher:

public VanillaService(IServiceHandlerDispatcher serviceHandlerDispatcher) { ... }
此ServiceHandlerDispatcher有一个对象字典ServiceHandler,它根据客户端的处理程序请求调用控制器对象。此控制器对象具有使用存储库的方法

public ServiceHandlerDispatcher(IMessageHandler[] messageHandlers) { ... }

public SaveSubmissionHandler(SubmissionController submissionController) { ... }

public SubmissionController(IRepository<Submission> submissionRepository) { ... }
公共服务HandlerDispatcher(IMessageHandler[]messageHandlers){…} 公共存储SubmissionHandler(SubmissionController SubmissionController){…} 公共提交控制器(IRepository submissionRepository){…} 所以这个链是这样的:服务->ServiceHandlerDispatcher->ServiceHandler->控制器->存储库->数据库

出于性能和内存方面的考虑,我希望ServiceHandlerDispatcher和所有ServiceHandler位于singleton作用域中,而不是InRequestScope中的repository对象(这样在每次调用中都会释放EF的DbContext),因为我可以有几十个ServiceHandler对象

同样,服务->ServiceHandlerDispatcher(SingletonScope)->ServiceHandler(SingletonScope)->控制器(无)->存储库(InRequestScope)->数据库

这是可能的还是必须让内核在每次调用中创建每个ServiceHandler?
如果需要链中的每个对象都在RequestScope中,那么如何实现ServiceHandler字典?使用工厂扩展?

因此,这是不可能的。如果链中的第一个项的作用域大于其他项(在本例中为SingletonScope),则链中的其他项也将具有该作用域