使用WCF和InRequestScope在N层应用程序中进行Ninject

时间:2012-10-30 08:56:06

标签: c# wcf entity-framework ninject

我正在使用带有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字典呢?随着工厂扩展?

1 个答案:

答案 0 :(得分:1)

所以,这是不可能的。如果我的链中的第一个项目的范围大于其他项目(在本例中为SingletonScope),则链中的其他项目也将具有该范围。