我正在使用带有WCF扩展和Web扩展的Ninject 3.01.1.10(全部来自nuget)
我在使用Entity Framework和Repository模式的WCF服务(有几个客户端桌面应用程序)中使用NInject。
由于我使用EF,我想使用InRequestScope,以便每次有服务请求时都会创建每个存储库(正如EF良好实践所指示的那样)。
我通过nuget安装了所有内容,并让NinjectWebCommon引导程序类在RegisterServices中注册服务,如Ninject WCF示例所示。当我在网上阅读时,我在InstanceContextMode.PerCall中也有WCF服务。
我的问题是:所有注入的对象链是否都需要在InRequestScope中,以便范围有效?
我的WCF服务正在构造函数中注入ServiceHandlerDispatcher:
public VanillaService(IServiceHandlerDispatcher serviceHandlerDispatcher) { ... }
此ServiceHandlerDispatcher具有对象ServiceHandler的字典,根据客户端的处理程序请求,该对象调用Controller对象。此控制器对象具有使用存储库的方法。
public ServiceHandlerDispatcher(IMessageHandler[] messageHandlers) { ... }
public SaveSubmissionHandler(SubmissionController submissionController) { ... }
public SubmissionController(IRepository<Submission> submissionRepository) { ... }
所以链是这样的:服务 - &gt; ServiceHandlerDispatcher - &gt; ServiceHandler - &gt;控制器 - &gt;存储库 - &gt; DB
出于性能和内存的目的,我希望ServiceHandlerDispatcher和所有ServiceHandler都在单例范围内,但是InRequestScope中的存储库对象(这样在每次调用时都会放置EF的DbContext),因为我可以拥有数十个ServiceHandler对象。
再次,服务 - &gt; ServiceHandlerDispatcher(SingletonScope) - &gt; ServiceHandler(SingletonScope) - &gt; controller(无) - &gt; repository(InRequestScope) - &gt; DB
这是可能的还是我必须让内核在每次调用中创建每个ServiceHandler? 如果需要链中的每个对象都需要InRequestScope,那么如何实现ServiceHandler字典呢?随着工厂扩展?
答案 0 :(得分:1)
所以,这是不可能的。如果我的链中的第一个项目的范围大于其他项目(在本例中为SingletonScope),则链中的其他项目也将具有该范围。