6

范围上下文命名绑定(和激活块?)的 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 中澄清这些概念。

4

1 回答 1

9

上下文:当前解析的元信息。它指定当前解析的对象将在对象树中的哪个位置注入。(例如,当前解析的对象将被注入到类 A 的构造函数中,该构造函数被注入到类 B 中,......)它可以用于例如使用When重载之一来决定绑定是否适用于当前上下文。它也被传递给流畅语法的许多其他回调(例如 InScope、OnActivation ......)

范围:定义对象的生命周期以及何时重用现有实例,有许多预定义范围以及可以从当前上下文指定范围的通用范围(InScope(ctx => ...

命名绑定:绑定的元信息。可以结合上下文使用。例如,绑定仅适用于当前上下文中任何父绑定具有某个名称的情况。

激活块:( 从 Ninject 2.x - 3.x 开始,这可能会在未来的版本中发生变化)。在激活块内,每个绑定都更改为将激活块作为作用域。这意味着绑定上指定的范围将被忽略。将在一个激活块上为解析创建一个实例。

我个人不会使用该功能,因为它忽略了所有其他类型的范围,例如InSingletonScope. 更好地使用 Ninject.Extensions.NamedScope 给出的范围。

关于您的示例:由于您有两个MyDbContext绑定,因此您需要为它们添加条件。例如WhenAnyAncestorNamed。或者您可以使用另一个范围,例如InCallScope()仅使用一个绑定。

于 2013-01-30T11:29:06.210 回答