7

我正在阅读 Mark Seemann 的 .NET 中的 Dependency Injection,但我一生都无法理解这一点:

尽管new关键字在涉及 VOLATILE DEPENDENCIES 时是一种代码异味,但您不必担心将其用于 STABLE DEPENDENCIES。new关键字通常不会突然“非法”,但您应该避免使用它来获取 VOLATILE DEPENDENCIES 的实例。

也许是因为我仍然无法理解环境上下文是一个注入而不仅仅是一个全局变量,但我只是不明白作者在说什么。

我真的很想从头到尾理解 DI,但现在我被卡住了,这只是本书的 1/3 ...... Control-Freak 反模式似乎是每个曾经生活过的程序员...

有人有任何见解吗?

4

3 回答 3

8

波动率(对我来说)是衡量一个班级需要改变的可能性。

理想情况下,您将类设计为对扩展开放但对修改关闭(开放封闭原则)。这并不总是可能的。那些你接近改变的类比其他类更不稳定。

NDepend(一个 .Net 静态分析度量工具)有一个称为Instability的度量,在我看来它是同义词。他们将其定义为:

不稳定性 (I):传出耦合 (Ce) 与总耦合的比率。I = Ce / (Ce + Ca)。该指标是装配体对变化的弹性的指标。该度量的范围是 0 到 1,I=0 表示完全稳定的装配,I=1 表示完全不稳定的装配。

您不希望稳定类依赖于不太稳定的类。

至于决定注入与否,这听起来更像是一个阶级角色问题。从领域驱动设计来看,(DDD)类通常是实体(它们具有身份)、服务(它们编排事物)或值(它们是不可变的和可比较的,例如 RED 或 100ml)。

你会注入服务,你会调用新的值。实体通常来自存储库(您注入的),但在内部存储库会在它们上调用 new。这有帮助吗?

于 2012-07-05T01:42:09.860 回答
1

通常 DI 容器将所有依赖项解析为具体实现并为您处理生命周期。但是DI Control-Freak则相反:使用new关键字创建具体对象,注入它们并仅自己处理生命周期。因此,没有其他人有可能在您的代码之外配置和处理依赖项。因此,通过提供其他实现或伪造来重用或测试它。

这是@mark-seemann 书中的引文,它回答了您的问题:

我将它命名为 CONTROL FREAK 来描述一个不会放弃对其依赖项的控制的类。

每次我们使用 new 关键字创建一个类型的新实例时都会发生这种情况。当我们这样做时,我们明确声明我们将控制实例的生命周期,并且没有其他人有机会拦截该特定对象。

于 2012-07-04T15:07:38.250 回答
1

我以前没有听过这些术语,但是转换我对依赖注入的了解,我将它们定义如下。

一个稳定的依赖是一个具体的实现在类或配置中不会随着时间或在不同情况下发生变化的依赖。

易失性依赖项的具体实现可能会随着时间或不同情况在类或配置中发生变化。

如果您可以原谅 Java 中的示例,那么稳定的依赖关系将是StringBuilder. 如果您正在编写构建字符串的方法,则不需要StringBuilder注入,只需创建它即可。ArrayList,等同上HashMap。除了标准库类之外,如果您正在编写银行应用程序,您可能不会注入 a RunningTotaliser,因为它只是为您添加数字的对象。

标准库中易失性依赖的例子更难想出。一个典型的例子是DataSource- 这是一个封装数据库连接细节的对象,几乎可以肯定这些不应该由实际建立连接的代码提供。

于 2012-07-04T16:54:32.537 回答