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