Подтвердить что ты не робот

Локатор сервисов, Инъекция зависимостей (и контейнера) и инверсия управления

Я программировал в течение некоторого времени, но никогда не интересовался теоретическим пониманием того, что означает каждая концепция, я могу использовать различные концепции программирования, но не зная об этом.

Локатор сервисов: Для меня это относится к записи ярлыков для ускорения разработки за счет сокращения количества кода. Один вопрос: может ли локатор ссылаться только на пространства имен/классы, или я могу иметь реестр переменных?

Вот мое понимание:

$locator = new ServiceLocator()
$locator->set('app', new System\Application());
$locator->set('db', new System\Pdo());

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

Инъекция зависимостей (и контейнер для инъекций зависимостей): Инъекция объектов внутри объектов, что позволяет им быстрее обращаться к ним независимо от шаблона factory. И контейнер DI?

Вот мое понимание:

$app = new System\Application(System\Config::load());

Инверсия управления: Не понимайте этот шаблон дизайна (или понимайте, но не знаете, что я делаю, это IoC)

Тогда, в теории (желательно с простыми примерами), что означает каждое из этих понятий? Правильно ли я, или что не так/может быть улучшено?

Спасибо!

4b9b3361

Ответ 1

Я думаю, что вы правильно поняли Service Locator.

О Injection Dependency означает, что если у объекта есть зависимости конструктора и/или свойства, они вводятся в объект снаружи, в отличие от объекта, который сам получает зависимости

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.

A Контейнер DI автоматически обрабатывает инъекцию зависимостей. Вы просто настраиваете его, чтобы он знал, какие конкретные классы должны быть возвращены при запросе абстракции. Контейнер обрабатывает создание объекта, впрыскивает зависимости через конструктор и/или свойства. В зависимости от контейнера (я не знаю примера для php, я знаком только с .Net контейнерами DI), возможно, вам придется регистрировать также типы объектов, которые могут быть созданы он.

Инверсия управления означает, что вместо класса более высокого уровня, зависящего от реализации класса (зависимости) более низкого уровня, управление обращается, поэтому реализация класса более низкого уровня зависит от абстракции, требуемой высшим класс уровня.

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

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

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

IoC и DiC объединяются, поскольку контейнер DI предлагает функцию IoC.

Ответ 2

Расположение службы и зависимость Инъекция сначала предназначена для развязывания классов, чтобы их можно было легко протестировать и изменить.

Когда вы сравниваете регистр и разрешать части контейнера IoC с локатором службы > кажется одинаковым.

Контейнер IoC можно использовать как локатор сервисов, который считается анти-шаблоном. Когда вы используете Service Location, вам всегда нужно активно вызывать сервис-локатор по всей вашей архитектуре. Таким образом, вы отключаете свои классы, но, с другой стороны, вы связываете их всех с Service Locator. Кроме того, обнаружение зависимостей сложнее с помощью Locator службы, поскольку вы скрываете зависимости. В то время как с Injection Dependency вы делаете зависимости "общедоступными" с помощью инсталляции конструктора.

Когда вы используете контейнер IoC, вы используете инъекцию зависимостей (инжекция конструктора или вложение свойств). Контейнер IoC теперь может преобразовывать граф зависимостей, просматривая параметры конструктора и создавая весь граф зависимостей. Это называется автоматической проводкой. Локатор службы не может устанавливать зависимости от автоматической проводки. Как я уже упоминал, вы не вынуждены использовать автоматическую проводку, вы можете легко использовать контейнер IoC, как локатор сервисов, просто позвонив контейнеру IoC в каждый класс напрямую, НО ВЫ НЕ ДОЛЖНЫ!

Смотрите также: fooobar.com/info/437379/...

enter image description here