服务定位器,依赖注入(和容器)和控制反转

我已经编程了一段时间,但从未对理论知道每个概念的含义感兴趣,我可能会使用各种编程概念,但不知道它。

服务定位器 :对我来说,是指通过减少代码量来加速开发的快捷方式记录。 一个问题是:可能Locator只引用命名空间/类,或者我可以有一个变量注册表?

这是我对它的理解:

$locator = new ServiceLocator()
$locator->set('app', new SystemApplication());
$locator->set('db', new SystemPdo());

// Get the objects
$locator->get('db')->connect();
$locator->get('app')->run();

依赖注入(和依赖注入容器) :注入对象内的对象,允许更快地访问这些对象,而不管工厂模式如何。 和DI容器?

这是我对它的理解:

$app = new SystemApplication(SystemConfig::load());

控制反转 :不理解这种设计模式(或者理解,但不知道我所做的是IoC)

那么,理论上(最好用简单的例子),这些概念中的每一个是什么意思? 我是否正确,或者出了什么问题/可以改进?

谢谢!


我认为你正确理解了服务定位器。

关于依赖注入 ,意味着如果对象具有构造函数和/或属性依赖关系,则这些对象通过外部注入对象中,而不是对象本身获得依赖项

public class MyClass
{
   private $_dep;
   public function __construct($dep=null)
   {
       //$dep has to be injected
       $this->_dep=$dep;                           
   }

   //this is wrong because it couples MyClass to a specific Dependency implementation
   public function __construct()
   {
       $this->_dep=new Dependency();
    }
}
   $dep=new Dependency();
   $obj=new MyClass($dep);

构造函数通常将抽象(接口)作为参数,在类外部实例化具体实现,然后在创建MyClass的新实例时传递给构造函数。

一个DI容器,自动处理依赖注入。 您只需对其进行配置,以便知道提取抽象时要返回哪些具体类。 Container处理对象创建,通过构造函数和/或属性注入依赖关系。 根据容器(我不知道php的例子,我只熟悉.net DI容器),您可能还需要注册可由其创建的对象的类型。

控制反转意味着,取决于较低级别的类(依赖性)实现,而不是较高级别的类,控制是反转的,所以较低级别的类实现取决于较高级别类所需的抽象。

//abstraction defined for the use of higher level class
public interface  IRepository {}

// that's the dependency, the lower level class  
public class XmlRepository implements IRepository {}

//the higher level class
 public class MyClass
 {
     public function __construct(IRepository $repo) {}
  }

由于DI Container提供IoC功能,IoC和DiC一起工作。


服务位置和依赖注入首先用于解耦类,以便可以轻松测试和更改它们。

当你比较寄存器并用服务定位器 解析 IoC容器的部分时,它看起来是一样的。

您可以使用IoC容器作为服务定位器,这被​​认为是反模式。 当您使用服务位置时,您必须始终在整个体系结构中主动调用服务定位器。 所以你解耦你的类,但另一方面,你将它们全部耦合到服务定位器。 而且,服务定位器对依赖关系的发现更加困难,因为您隐藏了依赖关系。 而在依赖注入中,通过使用构造器注入来使依赖关系变为“公共”。

当您使用IoC容器时,您使用依赖注入(构造函数注入或属性注入)。 IoC容器现在可以通过查看构造函数参数来重新创建依赖关系图并创建整个依赖关系图。 这被称为自动布线 。 服务定位器不能自动连接依赖关系。 正如我已经提到的,您不必强制使用自动布线,您可以通过简单地直接在每个类中调用IoC容器来轻松使用IoC容器,如服务定位器, 但是您不应该

另见:https://stackoverflow.com/a/11319026/175399

在这里输入图像描述

链接地址: http://www.djcxy.com/p/82237.html

上一篇: Service Locator, Dependency Injection (and Container) and Inversion of Control

下一篇: How to use Dependency Injection without breaking encapsulation?