Страницы

Поиск по вопросам

пятница, 14 февраля 2020 г.

Паттерны Poor Man's DI и Bastard Injection

#шаблоны_проектирования


Наткнулся в сети на комментарий, в котором упоминались паттерны Poor Man's DI и Bastard
Injection -- что это такое и в чём между ними разница?

(Любой язык программирования, не обязательно c#)
    


Ответы

Ответ 1



Poor Man's DI, также называемое Pure DI - это DI без специальной библиотеки-контейнера. В случае использования такого подхода все зависимости классов выносятся в параметры их конструкторов либо в свойства, причем все классы, конструкторы и свойства обязаны быть открытыми. Пример на C#: public class Baz { private readonly IBar bar; public Baz(IBar bar) { this.bar = bar; } } В Composition Root же пишется код, который собирает все эти классы вместе - то есть весь граф объектов собирается вручную. Код получается вроде вот такого: var foo = new Foo(); var bar = new Bar(foo); SomeFrameworkClass.SetControllerFactory(() => { // точка входа var baz = new Baz(bar); return new Controller(foo, baz); }); В чистом виде Pure DI используется редко, однако если ваши классы написаны с использованием Pure DI-подхода, то к проекту можно прикрутить любую библиотеку-контейнер, или же сменить ее в любой момент. Bastard Injection же - это полная противоположность прошлому подходу. В случае использования Bastard Injection каждый класс самостоятельно затягивает свои зависимости из контейнера используя его как Service Locator: public class Baz { private readonly IBar bar = App.container.Resolve(); } Главный недостаток такого подхода - зависимости оказываются раскиданы по коду. К примеру, без доступа к исходникам единственный способ определить какие зависимости нужны классу Baz - это вызвать его конструктор и посмотреть на отсутствие чего он ругнется. А уж опциональные зависимости без документации найти можно только декомпиляцией.

Комментариев нет:

Отправить комментарий