2016-08-22 4 views
0

У меня есть кость, чтобы выбрать инъекцию зависимости. Похоже, что такая простая концепция привела к большой путанице среди многих, и «правильный» путь к ней, похоже, выходит из-под контроля с точки зрения сложности. В соответствии вещь действительно просто я просто хочу знать:Зависимость впрыска в PHP и DIC

Это хорошая практика, если использовать стандартные функции, чтобы зарегистрировать свою зависимость, как это:

function someObject() { 
    return new someObject(); 
} 

И я могу передать параметры?

function someObject($param1) { 
    return new someObject($param1); 
} 

Наконец, как об использовании простого пользовательского класса контейнера:

class Dependencies { 
    function someObject($param1) { 
    return new someObject($param1); 
    } 
} 

И использовать его:

class SomeClass { 
    public function __construct(Dependencies $dependencies) { 
    $this->dependencies = $dependencies 
    } 

    public function methodNeedsDependency() { 
    $param1 = 'one'; 
    $task = $this->dependencies->someObject($param1); 
    } 
} 

Я думаю, что я спрашиваю, это приличная попытку a очень простой реализация DIC? Или есть некоторые основные основные проблемы, возникающие под поверхностью?

Спасибо!

ответ

1

Если SomeClass является фабрикой, предназначенной для создания некоторого экземпляра с определенной точной конфигурацией, то да, мы могли бы сказать, что это очень простая реализация DIC.

Вопросы здесь? Ну, допустим, вы хотите создать someObject с другими параметрами конструктора.

Решение:

  1. SomeClass Создать еще один завод, который будет проходить другой Params. Это избыточное решение, которое также смешивает два слоя приложений (конфигурация с уровнем создания объекта).

  2. Parametrize methodNeedsDependency с параметрами, которые будут переданы someObject. Это то, что позволяет вам откладывать при создании конфигурации кода.

  3. и последний, но наиболее подходящий способ: DIC должен быть гибким, должен позволять вам создавать любые экземпляры службы с любыми зависимостями, а вся конфигурация должна храниться на уровне конфигурации. Разделение проблем - попытайтесь заставить DIC не знать, какой тип объекта создает. Просто позвольте ему сделать объекты, которые вы описали где-то еще.

Есть много других вопросов, также, как, например, что, если Вы хотели бы иметь только один экземпляр данного класса для всей DIC (это легко «если» это, но это еще один обходной путь для надлежащего решение) или что с круговыми ссылками.

Это обсуждение может продолжаться и дальше с другими проблемами архитектуры в целом, например, «услуги должны быть без гражданства», что делает ненужным иметь более одного, но ответ на ваш вопрос - это три очка. Конечно, помните, что для DIC это не окончательный ответ. Это просто мой способ это увидеть ;-)

+0

Простой, но тщательный ответ ... Поэтому, когда вы говорите «_create some instance with some exact config given_», вы имеете в виду, что конфигурация должна быть задана на уровне контейнера?Или разумно ли _параметизировать_, как указано в шаге 2, где это передается в качестве аргумента на более позднем этапе? –

+1

Конфигурация должна быть указана на ... ну, config layer :) создать файл конфигурации (YAML, XML, TXT, что угодно), где вы говорите, что именно вы хотите передать экземпляру. Хорошим примером является конфигурация контейнера Symfony. Посмотрите, как там определяются службы. – mmmm

Смежные вопросы