我正在研究依赖注入模式。我已经阅读了很多示例,其中一个典型示例是使用XxxService / XxxRepository作为示例。但是根据我的观点,根据UML概念,类XxxRepository应该是类XxxService的关联。为什么不把这种情况称为关联注入,但仍然是依赖注入?:)
谢谢!
更新于1/26/2018
我目前认为dependency injection
的概念适用于此问题中描述的情况。因为关联只是UML中的一个特殊的依赖关系。
Please refer to this article,Martin Fowler说:
“如果对一个元素(供应商)的定义的更改可能导致另一个元素(客户端)的更改”,则两个元素之间存在依赖关系“。 这是一个非常模糊和一般的关系,这就是UML的原因 对不同形式的依赖有很多刻板印象。
和
关联也意味着依赖,如果两个类之间存在关联,那么也存在依赖关系。
所以我现在不能接受任何答案。或许这个问题不是一个好问题,因为每个开发人员都拥有自己的观点。我正在认真考虑结束这个问题。
答案 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比依赖项更通用:它可以是单向的或双向的,具体取决于它的可导航性。因此,在大多数情况下,“注入关联”对于首选方向没有任何说明:一旦关联存在,它仍然可能以错误的方式使用。