Шаблон реестра против шаблона локатора службы против контейнера внедрения зависимостей

Есть ли между ними разница, а не установка и получение объектов в массиве по ключу?

class Registry
{
private $container=array();
  public static function Set($name,$object){
    self::$container[$name]=$object;
  }
  public static function &Get($name){
  return self::$container[$name];
  }
}

person Namjith Aravind    schedule 09.01.2015    source источник


Ответы (1)


Шаблон реестра

Шаблон реестра — это шаблон, используемый для поиска объекта, зная только его имя. Этот шаблон хранит экземпляры объектов внутри и использует сопоставление словаря для последующего извлечения этих экземпляров.

Контейнер DI/паттерн DI

Контейнер внедрения зависимостей содержит реестр, в котором типы объектов сопоставлены с абстракциями. Он более продвинут в том смысле, что при разрешении объекта создается его экземпляр, как и все зависимости объекта.

Когда вы запрашиваете объект из контейнера внедрения зависимостей, вы получаете граф объектов, начиная с запрашиваемого объекта в качестве корня. Каждый зависимый объект внедряется автоматически путем рекурсивного прохождения конструктора каждого класса, начиная с классов, не имеющих зависимостей, и создания экземпляра каждого объекта, используя реестр в качестве ориентира.

Внедрение зависимостей — это шаблон, который не обязательно использовать контейнер внедрения зависимостей. Шаблон внедрения зависимостей состоит из корня композиции, который находится в точке входа. приложения. Корень композиции — это место, где регистрируются типы и создается экземпляр корневого графа объектов. После создания экземпляра корневого объекта приложение запускается самостоятельно. Само приложение не имеет ссылки на контейнер внедрения зависимостей и не связано с ним жестко.

Поиск сервисов

Многие считают, что локатор службы является анти-шаблоном. Идея состоит в том, что вы либо внедряете контейнер в свой объект, либо используете статическую ссылку на контейнер DI для создания экземпляров во время выполнения.

Основное отличие заключается в том, что приложение явно зависит от (таким образом, тесно связано) контейнера внедрения зависимостей.

Еще одним недостатком использования Service Locator является то, что, поскольку вы внедряете контейнер DI, невозможно увидеть из конструкторов классов, от каких интерфейсов он зависит. Вместо этого вам нужно обратиться к документации или проанализировать исходный код, чтобы определить, каковы зависимости класса.

Несмотря на то, что он считается анти-шаблоном, все же есть ситуации, когда его использование имеет смысл. Тем не менее, это следует рассматривать как крайнюю меру после того, как все другие варианты (окружающий контекст, внедрение свойств и т. д.) исчерпаны.

person NightOwl888    schedule 16.08.2015
comment
Таким образом, реестр может служить простым локатором сервисов. - person xmedeko; 14.10.2020
comment
@xmedeko - Не совсем так. Шаблон реестра не контролирует время жизни экземпляров, но внедрение контейнера зависимостей в приложение дает контейнеру зависимостей явный контроль над временем жизни экземпляров. Последние могут дать каждому типу разное время жизни, первые всегда являются одноэлементными, независимо от запрошенного типа. - person NightOwl888; 14.10.2020