关联注入或依赖注入?

时间:2018-01-05 16:32:24

标签: dependency-injection associations uml

我正在研究依赖注入模式。我已经阅读了很多示例,其中一个典型示例是使用XxxService / XxxRepository作为示例。但是根据我的观点,根据UML概念,类XxxRepository应该是类XxxService的关联。为什么不把这种情况称为关联注入,但仍然是依赖注入?:)

谢谢!

更新于1/26/2018

我目前认为dependency injection的概念适用于此问题中描述的情况。因为关联只是UML中的一个特殊的依赖关系

Please refer to this article,Martin Fowler说:

  

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

  

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

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

3 个答案:

答案 0 :(得分:1)

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

您可以使用或不使用注入来编码关联,但它是一种关联。

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

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

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

答案 1 :(得分:1)

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

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

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

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

class A {
    @Inject
    private IB b;

    //...
}

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

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

那么,我们不能在类A和其他类(哪个类?或哪个对象?)之间使用关联。

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

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

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

答案 2 :(得分:0)

根据wikipedia

  

依赖注入是一种对象提供的技术   另一个对象的依赖关系。 (...)将服务传递给客户端,而不是允许客户构建或查找服务,是模式的基本要求。

请注意,注射不必在施工时进行,即使经常进行注射。

dependency relation是单向的:一个对象依赖于另一个对象。依赖注入的目标是促进另一个方向(例如inverting a dependency

Associations比依赖项更通用:它可以是单向的或双向的,具体取决于它的可导航性。因此,在大多数情况下,“注入关联”对于首选方向没有任何说明:一旦关联存在,它仍然可能以错误的方式使用。