【问题标题】:Association Injection or Dependency Injection?关联注入还是依赖注入?
【发布时间】:2018-06-15 12:06:07
【问题描述】:

我正在研究依赖注入模式。我看过很多例子,其中一个典型的例子是使用 XxxService/XxxRepository 作为例子。但是在我看来,按照UML的概念,类XxxRepository应该是类XxxService的一个关联。为什么不把这种情况称为Association Injection,而仍然是Dependency Injection?:)

谢谢!

2018 年 1 月 26 日更新

我目前认为dependency injection的概念适合这个问题中描述的情况。因为Association只是UML中一个特殊的Dependency

Please refer to this article,Martin Fowler 说:

“如果对一个元素(供应商)的定义的更改可能导致对另一个元素(客户)的更改,则两个元素之间存在依赖关系”。 这是一个非常模糊和笼统的关系,这就是为什么 UML 对不同形式的依赖有很多刻板印象。

关联也意味着依赖,如果两个类之间存在关联,则也存在依赖。

所以我现在不能接受任何答案。或者这个问题可能不是一个好问题,因为每个开发人员都有自己的观点。我正在认真考虑结束这个问题。

【问题讨论】:

  • 人们为什么称他们所做的事情只能是推测(所以这里基于意见和离题)。请删除您问题的那一部分。
  • @ThomasKilian 在某些情况下是真的。然而,有时有一个历史背景或已知和记录的原因使这些命名问题的范围非常好。
  • @Christophe 有时。在这里,它们就像黑猩猩和大猩猩一样,都来自一个共同的前身:基本意义上的“依赖”。否则它们不相关。因此,如果黑猩猩进一步发展为倭黑猩猩或 UML 依赖关系,那么对大猩猩的关联并不重要。

标签: dependency-injection associations uml


【解决方案1】:

首先:我想澄清一些关于依赖注入的提示。

在依赖注入中(见reference(第4段)):

  • 客户端不需要知道如何构建服务。
  • 客户端不需要知道它使用的是哪些实际服务
  • 客户只需要了解服务的内在接口,因为这些定义了客户如何使用服务。

当我们使用如下代码的依赖注入时:

class A {
    @Inject
    private IB b;

    //...
}

我们实际上并不知道,哪个类(实现IB)的哪个对象被注入b

也许注入的类在运行时会发生变化,也许它会因为一些手动或自动处理的配置而发生变化。也许它会随着时间等动态变化。

所以,我们不能使用A 类与其他类(哪个类?或哪个对象?)之间的关联

因此,类A和接口IB之间只有依赖关系。

在小型项目中,也许我们的项目中只有一个IB 的实现。或者我们没有任何机制来进行动态注入。在这种情况下,可以使用关联。但是,在这种情况下,不需要依赖注入。

要从 Martin Fowler 那里找到好的解释和好的例子,请参阅 reference 2

【讨论】:

    【解决方案2】:

    因为依赖注入是为编码而非设计而定义的。

    您可以编写带有或不带有注入的关联,但它是关联。

    例如,在 Java 中,以下代码显示了实现接口 IB 的类 A 和类 B 之间的关联。

    class A{ @Inject private IB b; ... }

    Class A{ private IB b = new B(); ... }

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-01-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-11-19
      • 2013-02-10
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多