.net - Ninject 中的 "scope"、 "context"等有什么区别?

标签 .net ninject ninject-extensions

的Ninject概念可以吗?范围 , 上下文 , 命名绑定(bind) ,(和activation block?)在概念层面上被分开和解释清楚?

例如,我有一个从数据库加载数据记录的服务,它通过 Ninject 工厂扩展为每条记录构造一个“ worker ”。服务和单个工作人员都使用 Entity Framework 的对象上下文与数据库进行交互。 ObjectContext 通过构造函数注入(inject)到两者(以及其他共享依赖项)。目前它是单线程的,但最终工作人员需要在自己的线程中并行运行,因此他们将需要自己的 ObjectContext 实例和显式的启动/处置生命周期。 ObjectContext 实例需要在工作人员的“工作单元”期间共享(因此不是暂时的,因为它被注入(inject)到工作人员使用的多个存储库中)。我被困在试图获得这个功能。

我天真地想要这样的东西(使用 named scopecontext 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/

相关文章:

.net - 我可以在Mono中使用Open XML SDK吗?

c# - 结合单元测试(模拟)和依赖注入(inject)框架

Ninject 拦截 - 移植到 Ninject 3.0 时的重大更改

.net - .Net 中 AOP 的最佳实现是什么?

.net - 获取数据表列的下一个自动增量值?

c# - ASP.NET 5/MVC 6 中基于约定的绑定(bind)

c# - 如何轻松判断 Ninject 是否可以解析类

wcf - 无法让 Ninject 拦截与 WCF 一起使用

ninject - weakeventmessagebroker 和 messagebroker Ninject 扩展是否已弃用?

c# - 在 OpenCVSharp 中水平翻转图像