聚合和依赖注入的区别

Maa*_*man 7 php oop design-patterns dependency-injection aggregation

我最近研究了依赖注入设计模式。

class User
{

private $db;

public function __construct(Database $db) 
{
        $this->$db = $db;
}

}
Run Code Online (Sandbox Code Playgroud)

我不禁怀疑这我在聚合中学到的东西是一样的。如果我错了,请纠正我。我知道目标依赖注入聚集不同的。有什么我想念的吗?

CKi*_*ing 5

我忍不住想知道这和我在聚合中学到的东西是一样的

例如,考虑一个Department具有Professor对象数组作为实例变量的类。有两种方法可以使用某些Professor对象初始化教授数组。

  1. 您可以在某些不带参数的方法中通过说and来初始化Professor类中的数组元素。Departmentprofessors[0]=new Professor("CK");professors[1]=new Professor("MK");
  2. 您可以提供一个将Professor类型数组作为其参数的构造函数。任何想要实例化 a 的类都Department必须将Professor对象数组传递给构造函数。

聚合:使用选项 1 还是选项 2 来定义 a 如何Department获取其教授并不重要。即使没有系(假设该教授属于多个系),一位教授也会继续存在,因此无论该系如何获得教授,这都被称为聚合。

依赖注入如果您使用选项 2 创建Department实例,这将被称为依赖注入。一个系需要教授,而你通过从课堂外提供教授来满足这种依赖性Department

换句话说,聚合是一种关系类型,可以使用选项 1 或选项 2(或其他选项,例如从数据库获取教授并在方法内填充Professor数组)进行建模。Department依赖注入是设计类的方法,以便可以从类外部提供其依赖项。可以对聚合关系进行建模以支持依赖项注入,但这并不意味着聚合依赖项注入是同一件事。


Mat*_*zer 4

聚合是对象组合的一种形式。它与依赖注入无关。

另一方面,依赖注入不是关于对象如何关联,而是如何将其他对象(依赖项)放入特定对象中。依赖项可以是聚合、服务、存储库、验证器、文字......

通常,在强类型语言中,依赖项作为接口引入,以避免将对象与实现细节耦合。另一方面,在动态类型语言中,约定和强大的文档可以帮助构建良好且紧密耦合的依赖关系图。

请注意,数据库不能是聚合的。并非所有关联都被视为聚合,但您可以考虑注入依赖项

不管怎样,你的推理中有一些设计味道:用户不应该依赖数据库,但是如果你要实现类似 active 的东西,数据层/数据映射层将是注入到你的用户实体中的更好的候选者记录模式