它们之间有什么区别而不是通过键设置和获取数组中的对象吗?
class Registry
{
private $container=array();
public static function Set($name,$object){
self::$container[$name]=$object;
}
public static function &Get($name){
return self::$container[$name];
}
}
注册表模式
注册表模式 https://web.archive.org/web/20160313002006/http://securesoftwaredev.com:80/2009/03/01/the-registry-pattern/是一种用于查找仅知道其名称的对象的模式。该模式存储实例内部对象并使用字典映射稍后检索这些实例。
DI 容器/DI 模式
DI 容器包含一个注册表,该注册表具有以下映射对象类型 to 抽象。它更先进,因为当一个对象被解析时,它被实例化,并且该对象的所有依赖关系.
当您从 DI 容器请求对象时,您会得到一个对象图从您请求的对象作为根开始。每个依赖对象都是通过递归地遍历每个类的构造函数来自动注入的,从没有依赖项的类开始,并使用注册表作为指导实例化每个对象。
依赖注入是一个pattern that 不一定使用 DI 容器 http://blog.ploeh.dk/2014/06/10/pure-di/。 DI 模式由以下部分组成成分根 http://blog.ploeh.dk/2011/07/28/CompositionRoot/它位于应用程序的入口点。组合根是类型注册的地方,也是根对象图被实例化。一旦根对象被实例化,应用程序就会自行运行。应用程序本身没有对 DI 容器的引用,并且与其紧密耦合。
服务定位器
服务定位器被很多人认为是反模式 http://blog.ploeh.dk/2010/02/03/ServiceLocatorisanAnti-Pattern/。这个想法是,您可以将容器注入到对象中,或者使用对 DI 容器的静态引用在运行时创建实例。
主要区别在于应用程序是明确依赖上(这个紧密耦合到) DI 容器。
使用 Service Locator 的另一个缺点是,因为您正在注入 DI 容器,所以无法从类构造函数中看到它依赖于哪些接口。相反,您必须查阅文档或分析源代码来确定类的依赖项是什么。
尽管被认为是反模式,但在某些情况下使用它仍然有意义。但是,在用尽所有其他选项(环境上下文、属性注入等)后,应将其视为最后的手段。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)