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)
我不禁怀疑这与我在聚合中学到的东西是一样的。如果我错了,请纠正我。我知道目标的依赖注入和聚集是不同的。有什么我想念的吗?
我忍不住想知道这和我在聚合中学到的东西是一样的
例如,考虑一个Department
具有Professor
对象数组作为实例变量的类。有两种方法可以使用某些Professor
对象初始化教授数组。
Professor
类中的数组元素。Department
professors[0]=new Professor("CK");
professors[1]=new Professor("MK");
Professor
类型数组作为其参数的构造函数。任何想要实例化 a 的类都Department
必须将Professor
对象数组传递给构造函数。聚合:使用选项 1 还是选项 2 来定义 a 如何Department
获取其教授并不重要。即使没有系(假设该教授属于多个系),一位教授也会继续存在,因此无论该系如何获得教授,这都被称为聚合。
依赖注入如果您使用选项 2 创建Department
实例,这将被称为依赖注入。一个系需要教授,而你通过从课堂外提供教授来满足这种依赖性Department
。
换句话说,聚合是一种关系类型,可以使用选项 1 或选项 2(或其他选项,例如从数据库获取教授并在方法内填充Professor
数组)进行建模。Department
依赖注入是设计类的方法,以便可以从类外部提供其依赖项。可以对聚合关系进行建模以支持依赖项注入,但这并不意味着聚合和依赖项注入是同一件事。
聚合是对象组合的一种形式。它与依赖注入无关。
另一方面,依赖注入不是关于对象如何关联,而是如何将其他对象(依赖项)放入特定对象中。依赖项可以是聚合、服务、存储库、验证器、文字......
通常,在强类型语言中,依赖项作为接口引入,以避免将对象与实现细节耦合。另一方面,在动态类型语言中,约定和强大的文档可以帮助构建良好且紧密耦合的依赖关系图。
请注意,数据库不能是聚合的。并非所有关联都被视为聚合,但您可以考虑注入依赖项。
不管怎样,你的推理中有一些设计味道:用户不应该依赖数据库,但是如果你要实现类似 active 的东西,数据层/数据映射层将是注入到你的用户实体中的更好的候选者记录模式。