DI и внедрение зависимостей

Обсуждаем, как правильно строить приложения
Ответить
MaratCrash
Сообщения: 200
Зарегистрирован: 2011.03.02, 21:11

DI и внедрение зависимостей

Сообщение MaratCrash »

Всем привет.
Есть Class A, Class B, Class C, Class D. В конструкторе Class D интерфейс iClass, который наследуют классы A и B.

Код: Выделить всё

Class D {
    __construct (iClass $object) {
        ...
    }
}
Динамически в конструктор класса D могут прилететь как объекты класса A, так и класса B. Как это настроить на уровне DI и именно в конфиге?
Аватара пользователя
ElisDN
Сообщения: 5845
Зарегистрирован: 2012.10.07, 10:24
Контактная информация:

Re: DI и внедрение зависимостей

Сообщение ElisDN »

Или анонимкой:

Код: Выделить всё

$container->set(iClass::class, function() {
    $object = ...
    return new D($object);
});
или инъекцией фабрики:

Код: Выделить всё

class D {
    __construct (iClassFactory $factory) {
        ...
    }
    function smth($param) {
        $object = $factory->create($param);
    }
}
MaratCrash
Сообщения: 200
Зарегистрирован: 2011.03.02, 21:11

Re: DI и внедрение зависимостей

Сообщение MaratCrash »

А никак по другому? Не хочется, что в конфиге была логика (даже вызовы билдеров).
А если я в конфиге параметров определю все возможные вариации зависимостей (грубо говоря, сделаю мапу), а уже в коде буду разворачивать получать нужный класс?
Аватара пользователя
ElisDN
Сообщения: 5845
Зарегистрирован: 2012.10.07, 10:24
Контактная информация:

Re: DI и внедрение зависимостей

Сообщение ElisDN »

MaratCrash писал(а): 2017.05.21, 18:46 Не хочется, что в конфиге была логика (даже вызовы билдеров).
Контейнер - это вещь статическая, а не динамическая. Так что логику статически в конфиг, либо динамически в фабрику.
MaratCrash
Сообщения: 200
Зарегистрирован: 2011.03.02, 21:11

Re: DI и внедрение зависимостей

Сообщение MaratCrash »

По логике извлечения зависимостей понятно, спасибо - сделаю через фабрику.
А сами зависимости в приложениях Yii как лучше хранить в моем случае? Пока склоняюсь к конфигу.
Аватара пользователя
ElisDN
Сообщения: 5845
Зарегистрирован: 2012.10.07, 10:24
Контактная информация:

Re: DI и внедрение зависимостей

Сообщение ElisDN »

Склоняюсь к https://github.com/ElisDN/yii2-demo-agg ... tstrap.php с регистрацией в конфиге:

Код: Выделить всё

'bootstrap' => [
    'log',
    'app\bootstrap\ContainerBootstrap',
],
MaratCrash
Сообщения: 200
Зарегистрирован: 2011.03.02, 21:11

Re: DI и внедрение зависимостей

Сообщение MaratCrash »

В конфиге в секции container -> definitions, так? Я бы тогда массив с зависимостями (набор классов) смог инжектить куда захочу.
Аватара пользователя
ElisDN
Сообщения: 5845
Зарегистрирован: 2012.10.07, 10:24
Контактная информация:

Re: DI и внедрение зависимостей

Сообщение ElisDN »

Можно и в container -> definitions, если удобно.
MaratCrash
Сообщения: 200
Зарегистрирован: 2011.03.02, 21:11

Re: DI и внедрение зависимостей

Сообщение MaratCrash »

ElisDN писал(а): 2017.05.22, 10:14 Можно и в container -> definitions, если удобно.
А как при этом прокинуть массив с зависимостями в фабрику? ЧТо-то у меня не подхватывает фабрика параметры и поулчаю ошибку:
Ответить