的Ninject概念可以吗?范围 , 上下文 , 命名绑定(bind) ,(和activation block?)在概念层面上被分开和解释清楚?
例如,我有一个从数据库加载数据记录的服务,它通过 Ninject 工厂扩展为每条记录构造一个“ worker ”。服务和单个工作人员都使用 Entity Framework 的对象上下文与数据库进行交互。 ObjectContext 通过构造函数注入(inject)到两者(以及其他共享依赖项)。目前它是单线程的,但最终工作人员需要在自己的线程中并行运行,因此他们将需要自己的 ObjectContext 实例和显式的启动/处置生命周期。 ObjectContext 实例需要在工作人员的“工作单元”期间共享(因此不是暂时的,因为它被注入(inject)到工作人员使用的多个存储库中)。我被困在试图获得这个功能。
我天真地想要这样的东西(使用 named scope 和 context preservation 扩展):
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 导致“多个匹配的绑定(bind)...”错误。在阅读了更多之后,我现在认为我应该使用 named bindings对于 worker ,它是 ObjectContext。我认为我仍然需要范围,以便我可以在工作人员完成时显式地处置 ObjectContext(并且具有来自 ninject 范围处理的处置方法)。
无论如何,我仍然主要是在猜测,我发布这个问题是希望有人可以在 Ninject 中澄清这些概念。
最佳答案
上下文: 当前解析的元信息。它指定当前解析的对象将在对象树中的哪个位置注入(inject)。 (例如,当前解析的对象将被注入(inject)到类 A 的构造函数中,该构造函数被注入(inject)到类 B 中,......)它可以用于例如使用 When
重载之一来决定绑定(bind)是否适用于当前上下文.它也被传递给流畅语法的许多其他回调(例如 InScope、OnActivation ......)
范围: 定义对象的生命周期以及何时重用现有实例,有许多预定义范围以及可以从当前上下文指定范围的通用范围(InScope(ctx => ...
)
命名绑定(bind): 关于绑定(bind)的元信息。可以结合上下文使用。例如。仅当在当前上下文中任何父绑定(bind)具有某个名称时,该绑定(bind)才适用。
激活 block :(从 Ninject 2.x - 3.x 开始,这可能会在 future 的版本中发生变化)。在激活 block 内,每个绑定(bind)都更改为将激活 block 作为作用域。这意味着绑定(bind)上指定的范围将被忽略。将在一个激活 block 上为解析创建一个实例。
我个人不会使用该功能,因为它存在缺陷,因为它忽略了所有类型的其他范围,例如 InSingletonScope
。更好地使用 Ninject.Extensions.NamedScope 给出的范围。
关于您的示例:由于您有两个 MyDbContext
绑定(bind),因此您需要向它们添加条件。例如WhenAnyAncestorNamed
。或者,您可以使用另一个 Scope,例如 InCallScope()
,仅使用一个绑定(bind)。
关于.net - Ninject 中的 "scope"、 "context"等有什么区别?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14593741/