范围、上下文、命名绑定(和激活块?)的 Ninject 概念能否在概念级别上分开并清楚地解释?
例如,我有一个从数据库加载数据记录的服务,它通过 Ninject 工厂扩展为每条记录构造一个“工人”。服务和单个工作人员都使用实体框架的对象上下文与数据库进行交互。ObjectContext 通过构造函数注入到两者(以及其他共享依赖项)。目前它是单线程的,但最终工作人员需要在自己的线程中并行运行,因此他们将需要自己的 ObjectContext 实例和显式的启动/处置生命周期。ObjectContext 实例需要在工作人员的“工作单元”期间共享(因此不是暂时的,因为它被注入到工作人员使用的多个存储库中)。我被困在试图获得这个功能。
Bind<MyDbContext>().ToSelf();
Bind<MyService>().ToSelf();
Bind<IWorkerFactory>().ToFactory().InThreadScope(); // scope prob not necessary
Bind<MyWorker().ToSelf().DefinesNamedScope("workerScopeName");
Bind<MyDbContext>().ToSelf().InNamedScope("workerScopeName");
这显然(至少对 Ninject 用户来说是显而易见的)由于 MyDbContext 导致“多个匹配的绑定...”错误。在阅读了更多之后,我现在认为我可能应该为工作人员使用命名绑定,它是 ObjectContext。我认为我仍然需要范围,以便我可以在工作人员完成时显式处置 ObjectContext(并且具有来自 ninject 范围处理的处置方法)。
无论如何,我仍然主要是在猜测,我发布这个问题是希望有人可以在 Ninject 中澄清这些概念。