0

我正在使用带有 WCF 扩展和 Web 扩展的 Ninject 3.01.1.10(全部来自 nuget)

我在使用实体框架和存储库模式的 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) { ... }

所以链是这样的:Service -> ServiceHandlerDispatcher -> ServiceHandler -> 控制器 -> 存储库 -> DB

出于性能和内存的目的,我希望 ServiceHandlerDispatcher 和所有 ServiceHandler 在单例范围内,但在 InRequestScope 中的存储库对象(以便在每次调用中释放 EF 的 DbContext ),因为我可以有几十个 ServiceHandler 对象。

同样,Service -> ServiceHandlerDispatcher (SingletonScope) -> ServiceHandler (SingletonScope) -> 控制器 (none) -> 存储库 (InRequestScope) -> DB

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

4

1 回答 1

1

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

于 2012-11-01T09:44:42.920 回答