问题标签 [dependency-injection]

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.

0 投票
3 回答
5109 浏览

nhibernate - 使用 NHibernate 对象进行依赖注入

我想知道如何告诉 NHibernate 解决对我的 POCO 域对象的依赖关系。

我发现CalculateOrderTax 之类的方法应该在Domain 对象中,因为它们对特定于域的业务规则进行编码。但是一旦我有两个,我就违反了 SRP。

将这些方法提取到 Strategy 类中没有问题,但我想知道如何让 NHibernate 加载这些方法。

在将对象移交给更高层之前,循环遍历存储库中的对象列表以执行基于 get/set 的依赖注入似乎不是一个好的解决方案。

我现在也在使用 Castle Windsor 进行依赖注入。

0 投票
8 回答
1290 浏览

unit-testing - 使用数据库的 Web 应用程序中的单元测试

我正在构建一个 Web 应用程序,该应用程序将数据库用于用户、安全/角色并存储内容。

开始单元测试的道路对我来说似乎有点令人生畏,因为我必须确保我的数据库已正确初始化,以便我的测试运行。

在这方面有哪些常见的做法可以提供帮助?

即在开发/测试时,我可能会删除一个用户,但要让我的测试通过,该用户必须在数据库中,以及他的个人资料、安全设置等。

我知道我可以创建一个设置脚本,重新创建数据库等。

我不想最终花费我的全部时间来维护我的测试并确保我的数据库处于同步状态

或者这就是单元测试/TDD 的成本?

0 投票
4 回答
3041 浏览

.net - ResolveAll 做什么

在国际奥委会ResolveAll做什么?我知道官方的答案是“解决所有与此类型匹配的有效组件”。这是否意味着它将返回任何实现给定接口的类?

0 投票
3 回答
2107 浏览

.net - Unity中的“列表注入”?

我有一个项目即将推出,该项目将涉及通过相同的接口连接到一对多的后端系统;我们称它为 IBacksideProvider。

我想使用 Unity 在运行时注入这些提供程序。问题是因为我们谈论的是 1...n 个后端系统,所以我需要注册 1...n 个 IBacksideProvider 的实现。Unity 不支持开箱即用。

然而,这篇博文表明这是可以做到的。我想知道是否有人这样做过或知道如何使用 Unity 以便能够做到这一点。TIA。

0 投票
8 回答
21348 浏览

c++ - C++中的依赖注入

这也是我在 Miško Hevery 的一个关于依赖注入的谷歌谈话中的评论中提出的一个问题,但它被埋没在评论中。

我想知道将依赖项连接在一起的工厂/构建器步骤如何在 C++ 中工作。

即我们有一个依赖于 B 的类 A。构建器将在堆中分配 B,在 A 的构造函数中传递指向 B 的指针,同时在堆中分配并返回指向 A 的指针。

之后谁清理?建好后让builder清理好不好?这似乎是正确的方法,因为在谈话中它说构建器应该设置预期具有相同生命周期的对象,或者至少依赖项具有更长的生命周期(我对此也有疑问)。我在代码中的意思是:

现在,如果有一个依赖项预计会比我们将其注入的对象的生命周期更长(比如 ClassC 就是那个依赖项),我知道我们应该将构建方法更改为:

您首选的方法是什么?

0 投票
1 回答
1724 浏览

c# - 动态程序集加载时的依赖注入

我有一个有很多 IOrderDataLoader 实现的 winforms 应用程序。其他团队开始构建自己的 IOrderDataLoader 新实现。因此,我们将应用程序切换为查看 Dll 目录并使用反射加载所有实现 IOrderDataLoader 的类。这样,其他组可以自行部署他们的 dll,主应用程序会按需加载它们。

问题是我们作为一个内部项目拥有的实现之一,我们正试图移出到它自己的部署中,它有许多依赖项。我该如何解决这个问题并将其与所有依赖项一起加载?所有其他数据加载器都有空的构造函数,所以我只是循环。.

0 投票
11 回答
4474 浏览

c# - 依赖注入替代方案

我正在研究依赖注入,我可以看到它的好处,但我遇到了它创建的语法问题。我有这个例子

问题是我不想写

我会继续写

因为我觉得第一种选择感觉不自然。我不想知道 BusinessProduct “依赖”什么来获得产品,而且我觉得它使我的代码更难读。

这种方法是否有任何替代方法,因为我想保留用于创建对象的原始语法,但我希望在单元测试时仍然能够伪造依赖关系,或者这种依赖注入框架可以为我做些什么?

我正在用 c# 编码,但欢迎使用其他语言的替代品

0 投票
1 回答
1534 浏览

asp.net-mvc - 如何使用 Autofac 确保每个请求都有一个 NHibernate ISession?

我在 Application_Start 方法中使用的 Autofac 模块中有以下代码:

存储库的构造函数将 ISession 作为参数。但是我最终得到了整个应用程序的一个会话,即使我明确要求它是 HttpRequestScoped。

我已经配置了 ContainerDisposal HTTP 模块。

根据文档,您必须创建一个嵌套容器,但我让 Autofac 自动装配依赖项。

我该怎么办?

谢谢!

0 投票
3 回答
1898 浏览

c# - 在测试之外使用模拟对象,不好的做法?

我正在从事一个有很多外部服务消息传递的项目。用稍微“双曲线”的方式来描述它的一个好方法是系统必须向 Flicker API、Facebook API 和 Netflix API 发送消息的应用程序。

为了支持断开连接的场景、日志记录、开发人员可用性、配置等……我尝试了一种大量使用泛型和表达式树的方法。最终结果如下所示:

总的来说,我对最终结果很满意,但我觉得我犯了一个错误,或者在测试和断开连接的场景方面忽略了某个地方的设计原则。

在测试期间,无论是自动化的、单元的还是基于人的,我都实现了一个对象工厂,它最初使用 DI 在“实时模式”中执行正确的操作,并使用 Mocks 提供一种不做任何事情的无菌信使所有在测试模式下。

我只看到或读过 Mocks 在纯 TDD 模式下使用,而不是被用作某种愚蠢的对象。我看到的方法将围绕着对我使用的所有 API 所依赖的 HTTP 通信功能进行存根或模拟。

我主要担心的是,我希望连接的所有不同服务最终将不得不做很多细粒度的工作来替换特定的 HTTP 实现,如果我使用存根方法,我将为这些服务中的每一个提供 3 个类( IService、ConcreteService、StubService )并在实现新方法或更改任何内容时维护它们将是真正的 PITA。

在当前的实现中,我使用 Mocks 来免费获得“无菌模式”,几乎无需为了符合某个测试主体而实现任何额外的东西。

问题是我错过了什么吗?我是否以更方便的方式使用 Mocks 违反了设计原则?

任何人都可以就如何从许多不同的外部服务中获得无菌模式提供任何建议,而无需跳过很多圈子?

这个问题有意义吗?

感谢所有的答案。

编辑#1:

我最初的问题并不清楚。任何空对象或模拟对象都将纯粹用于开发/调试/测试环境。在生产中,发送这些消息的代码将是它们的实际实现。

我对每个人都投了赞成票,因为对于这个问题似乎有很多不同的解决方案,我将探索每一个。

请不要认为这个问题已经得到回答,我会尽可能多地获得建议。

0 投票
2 回答
2502 浏览

java - 需要模式建议(Hibernate + Guice)

我正在寻找有关如何将运行时依赖项注入从 Hibernate 检索的 JPA 实体的建议。我的问题本质上是这样的:

我有许多不同的 Transaction 对象子类。每个 Transaction 子类在执行时都有不同的行为,并且需要与环境不同的一组依赖项。这些 Transaction 对象由 Hibernate 作为 JPA 实体进行管理,因此我无法像在应用程序的其余部分中那样有效地使用 Guice 进行依赖注入来使用它们的环境依赖项填充实例。

为了解决这个问题,我采用了一种类似于访问者模式的方法,如下所示:

对于事务生命周期的不同部分,我有各种 Transactor 实现。可以使用 Guice 将这些依赖注入到我想要处理事务的上下文中,我只需调用:

我不喜欢这种方法的是(1)并非每种类型的事务都应该在每个生命周期阶段都可以执行,但是每个 Transactor 都必须为每个事务子类实现一个 execute() 方法以及(2)基本上没有注入的依赖项用于处理一种以上的交易类型。

本质上,我的 Transactor 接口和实现有很多不相关的 crud 放在一起。理想情况下,我只在事务对象本身上有 execute() 方法,但我不希望调用代码必须知道事务的类型或它所需的依赖项。此外,这可能会使测试变得更加困难,因为如果 execute() 方法是 Transaction 对象上的具体方法,我将无法轻松模拟它。使用 Transactor 接口意味着我可以根据需要轻松地对其进行模拟。

任何人都可以建议如何以类型安全的方式解决这个问题,这种方式不会导致一堆大部分不相关的行为在 Transactor 中聚集在一起,而是保持可测试性并允许依赖注入?