问题标签 [compositionroot]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
c# - 何时在 Windows 服务中编写应用程序根目录
给定一个将作为 Windows 服务运行的 C# 控制台应用程序,有 2 个应用程序入口点。第一个明显的是static void Main
方法。此方法的部分工作是安装扩展的东西,ServiceBase
然后运行它以OnStart
调用其方法。还有像 Topshelf 这样的更高级别的工具可以帮助您避免较低级别的ServiceBase
实现,但是您最终还是会得到 2 个潜在的应用程序入口点:static void Main
和某种OnStart
方法。
这种服务的应用程序根应该在服务的OnStart
方法中组成,还是早于作为的一部分static void Main
?
OnStart
似乎在服务的方法中进行组合(并在方法中销毁/处置它)可能会有优势,OnStop
因为重新启动服务会组合一个新的应用程序根。我在这里看到的唯一真正的缺点是,如果我使用像 Topshelf 这样的工具,我不能使用 DI 容器来获取我的 Service 类的实例。再说一次,这可能不是一个真正的劣势。Main
尽管如此,我阅读的大多数应用程序都是在 期间而不是在 期间构成根OnStart
,我不知道为什么。
一种方法真的比另一种更好,还是取决于,我的问题真的是基于意见的?
c# - 具有依赖注入的 DbContext 生命周期
我对DbContext
在我的 WinForms 应用程序中使用依赖注入来管理我的生命周期的正确方法感到困惑。现在,我的代码如下所示
我遇到的问题是,这种模式导致我的所有存储库在我的程序启动时都被创建,因此MyContext
实例在整个程序中都存在。因此,当数据库在我的程序之外更新时,我的程序看不到新数据,因为MyContext
它正在使用对它已经加载的数据的引用。
如果这是一个 Web 应用程序,那么我会为每个请求创建新的依赖项,但由于这是 WinForms,我不明白如何解决这个问题,同时保持一个单一的组合根并且不传递我的 Unity 容器我的程序(或对其有静态引用),以便每个控制器都可以解决自己的每个实例依赖项。
这个问题的标准解决方案是什么,我在如何/在哪里编写我的依赖项或使用我的DbContext
?
我知道 MVC 更适用于 Web 应用程序,而 MVVM 或 MVP 之类的东西可能更适合非 Web 应用程序,但是它们都存在相同的问题,即单个组合根只被调用一次。
c# - Ninject 和 Xamarin iOS:如何将依赖项注入到由框架创建的实例中
我正在我当前的 Xamarin (iOS) 项目中尝试 Ninject,该项目使用 Storyboards 创建用户界面。
问题是UIViewController
s 是由框架创建的,而不是由 Ninject 创建的。所以我手动注入依赖属性注入:
但是这样我就破坏了对象图,不是吗?例如, ViewController 实际上是 a 的孩子,UITabBarController
我想使用诸如InCallScope
ect 之类的东西。我该如何解决?
windows-services - 我应该在哪里创建 Windows 服务中的组合根?
在我拥有的 Windows 服务应用程序的命令行 exe 应用程序中,有一个main
方法,这就是我使用简单的注入器注册所有依赖项的地方IoC
。那是我现在的作曲根。在同一个Windows 服务应用程序中,有一个OnStart
可覆盖的方法。那就是我做ETL操作的地方。
我应该在哪里保留组合根?在main
方法或OnStart
?
dependency-injection - 六边形应用自动化测试中的组合根
我正在使用 Specflow (C# cucumber) 使用 BDD 方法开发一个六边形应用程序。
我想实现自动化场景系统测试,运行核心并在内六边形的端口而不是生产适配器上注入测试双。
我也在使用组合根模式,这意味着核心依赖关系是在核心之外解决的:这对我来说已经很臭了(解决核心对注入适配器的外六边形的依赖关系是正确的,但是呢?核心的内部依赖关系?)。
通常测试类以它们的方式解决依赖关系,注入测试替身,但现在它们也必须能够组装核心。所以现在我们在解决核心的依赖关系方面没有一个事实,因为测试必须复制组合根,如果生产组合根替换核心的内部服务修改和破坏其行为,自动化测试仍然是绿色的,导致测试组合根仍然注入服务的旧实现。
这个问题的正确解决方案是什么?谢谢
.net - 使用 DI 时如何新建对象
我刚刚在 PluralSight 上观看了一个依赖注入课程,它为我解决了一些问题。但是,尽管它跨越了几层,但也没有关于当你只需要在你的 codede 中更新对象时究竟要走什么路的信息。
这是我努力掌握的最后一块拼图。我知道 Compisition Root 以及大致如何使用它。我知道要避免使用 ServiceLocator 并通过将 IoC 容器定义为代码库中几乎每个类中的 ctor 参数来避免将 IoC 容器传递到代码的所有级别(我都曾在我工作的公司中并排看到过)为了)。
让我们考虑下面的两个例子,我认为把所有东西都交出来是不切实际的。
我可以注入依赖项,但我不可能注入所有东西,毕竟它不称为对象注入,所以问题是如何在循环内动态创建 Doee 对象:
现在在一些“不太动态”的情况下,问题是对于一些 IO 类既没有接口也没有抽象基类可用,这意味着它们很难在测试代码中处理,而且我什至不知道如何使用 IoC 容器处理它们,例如 Process 类:
到目前为止,我所做的是在这两种情况下都引入一个我可以注入的抽象工厂类,并在需要时为我提供所需的东西(即在循环中动态地)。我有一个生产使用的实现。在测试代码中,我可以实现它或者只是模拟它(因为它是抽象的)。对于 Process 类,我引入了一个带有接口 (I)ProcessProxy 的代理类,它通过对实际 Process 类的调用传递。如果需要,我也可以轻松地嘲笑它。然后这两个示例变成了我在下面列出的内容。
我的问题是,在这两种情况下(这是我主要关心的问题),这是正确的方法吗?我知道我可能会引发固执己见的答案,但我只是想弄清楚这是否是本着干净直接的教科书(如 DependencyInjection 和 CompositionRoot 实现)的精神推荐的方式。如果这不是首选的方式,那么它是什么?
重构和启用 DI 后的循环示例:
重构并启用 DI 后的流程示例:
typescript - typescript express 中组合根的实现
我试图了解我应该如何在项目中实现组合根。
根据我的红色,如果以错误的方式使用组合根(例如,通过在应用程序代码的很多地方引用它),您最终会得到服务定位器。
让我向您展示一个没有组合根的项目示例。
我有以下项目结构:
- 服务器.ts
- 域.ts
- 应用程序.ts
- api.ts
- sql 存储库
服务器.ts:
此文件导入 API 并初始化服务器。
域.ts:
该文件包含域的核心逻辑。
应用程序.ts:
该文件包含应用程序的用例。
sql-repository.ts:
该文件包含 IRepository 接口的具体实现
api.ts:
此文件包含使用 application.ts 文件中的用例的 api
Ofc 这只是一个示例,但您了解项目的外观。
从您所见,一切都很好,直到我们看到 api.ts 文件。它导入具体实现并将其注入到用例中。如果要导入和使用更多的依赖项怎么办,我不希望 api.ts 负责决定哪些实现去哪个地方,这不是它的责任。
但另一方面,我应该如何实现组合根呢?我不知道我应该如何构造完整的对象图,然后将其传递给服务器对象,以便正确的实现将转到正确的对象。
提前致谢!
dependency-injection - 每个模块都有一个用于 DI 的 XML 配置文件是否有意义?
我一直在阅读有关 DI 和组合根的信息。我在文章中读到只有应用程序应该有组合根,而不是库。
但是让我们假设我有一个带有一些接口及其实现的可重用包。我想将该接口绑定到实现。我认为如果用户必须自己做这一切会很麻烦。
在可重用模块中包含一个 XML DI 配置文件是否有意义,它将在组合根中使用和处理?
dependency-injection - Composition Root 和 Composer 的关系
我阅读了依赖注入原理、实践和模式,并试图弄清楚Composition Root和Composer之间的实际区别。
在书中,它们的定义是:
组合根是应用程序中的单个逻辑位置,其中模块组合在一起。
Composer是一个统一的术语,指的是任何组成依赖关系的对象或方法。它是合成根的重要组成部分。Composer 通常是一个 DI 容器,但它也可以是任何手动构造对象图的方法(使用纯 DI)。
Composition Root更像是我们应该创建应用程序图的地方/位置的名称,而Composer是实际执行它的那个东西吗?或者是别的什么?
如果您使用 DI Container,Composition Root应该是您使用 DI Container 的唯一位置。
您还可以在Composition Root中拥有什么?它不只是一个 DI Container 吗?
问候
c# - 如何将依赖项注入具有向后引用的树对象?
如何生成一个组合根,它创建一个具有向后(父引用)的对象树。
想象一下我想构建一个二叉树的以下简单节点对象:
这是我卡住的地方:
我是否因为它包含循环依赖关系而尝试将依赖注入原理与这种对象图相结合而走错了路?解决方案是什么?