它们之间有什么不同,而不是按键在数组中设置和获取对象?
class Registry
{
private $container=array();
public static function Set($name,$object){
self::$container[$name]=$object;
}
public static function &Get($name){
return self::$container[$name];
}
}发布于 2015-08-16 06:54:35
注册表模式
注册表模式是一种用于查找只知道对象名称的对象的模式。此模式在内部存储对象实例,并在稍后使用字典映射检索这些实例。
DI容器/DI模式
DI容器包含一个注册表,它将对象类型映射为抽象。更高级的是,当解析一个对象时,它被实例化,所有对象的依赖项也都是实例化的。
当您从DI容器请求对象时,您将得到一个以您请求的对象为根的对象图。每个依赖对象通过递归遍历每个类的构造函数自动注入,从没有依赖项的类开始,并使用注册表作为指南实例化每个对象。
依赖注入是不一定使用DI容器的一种模式。DI模式由位于应用程序入口点的复合根组成。组合根是注册类型和实例化根对象图的位置。一旦根对象被实例化,应用程序就会自行运行。应用程序本身没有引用DI容器,也没有紧密耦合到它。
服务定位器
服务定位器被许多人认为是反模式。其想法是要么将容器注入对象,要么使用对DI容器的静态引用来在运行时创建实例。
主要的区别是,应用程序显式地依赖于(因此紧密耦合到) DI容器。
使用Service的另一个缺点是,由于您正在注入DI容器,因此无法从类构造函数中看到它依赖的接口。相反,您必须查阅文档或分析源代码,以确定类的依赖项。
虽然被认为是反模式,但仍然有一些情况下,它是有意义的使用。然而,在所有其他选项(环境上下文、属性注入等)之后,它应该被视为最后的手段。已经筋疲力尽了。
https://stackoverflow.com/questions/27854298
复制相似问题