diff options
Diffstat (limited to 'content/digarden/pages/20211210234818-dependency_injection.org')
-rw-r--r-- | content/digarden/pages/20211210234818-dependency_injection.org | 117 |
1 files changed, 117 insertions, 0 deletions
diff --git a/content/digarden/pages/20211210234818-dependency_injection.org b/content/digarden/pages/20211210234818-dependency_injection.org new file mode 100644 index 0000000..fbac036 --- /dev/null +++ b/content/digarden/pages/20211210234818-dependency_injection.org @@ -0,0 +1,117 @@ +:PROPERTIES: +:ID: 49387584-0ee5-42ab-bc90-648062e74a91 +:END: +#+title: Dependency Injection +* Dependency Injection +Часть инверсии контроля, которая занимается инициализацией объектов и их +зависимостей обычно в единственном экземпляре. Объекты обычно передают в +аргументах функций-конструкторов класса, а штука находящая объекты +называется сервис-локатором. + +Суть паттерна заключается в том, чтобы не инициализировать лишний раз в +конструкторе объекты вручную и не инициализировать лишний раз экземпляры +классов в принципе (IoC). + +*Сервис-контейнер* -- класс, инициализирующий различные объекты, которые в +последствии хранит в одном из своих полей. + +*Сервис* -- объекты, управляемые сервис-контейнером. + +*Реализации:* ++ Java + http://picocontainer.com/ ++ Python + https://github.com/ets-labs/python-dependency-injector + +*PHP и Symfony:* +http://fabien.potencier.org/what-is-dependency-injection.html ++ Dependency Injection без контейнеров +#+begin_src php + class User + { + function __construct($storage) + { + $this->storage = $storage; + } + + // ... + } + + $storage = new SessionStorage('SESSION_ID'); + $user = new User($storage); +#+end_src + ++ Реализация возврата объекта в единственном экземпляре +#+begin_src php + class Container + { + static protected $shared = array(); + + // ... + + public function getMailer() + { + if (isset(self::$shared['mailer'])) + { + return self::$shared['mailer']; + } + + $class = $this->parameters['mailer.class']; + + $mailer = new $class(); + $mailer->setDefaultTransport($this->getMailTransport()); + + return self::$shared['mailer'] = $mailer; + } + } +#+end_src + ++ Реализация сервис-контейнера +#+begin_src php + class Container + { + static protected $shared = array(); + + protected $parameters = array(); + + public function __construct(array $parameters = array()) + { + $this->parameters = $parameters; + } + + public function getMailTransport() + { + return new Zend_Mail_Transport_Smtp('smtp.gmail.com', array( + 'auth' => 'login', + 'username' => $this->parameters['mailer.username'], + 'password' => $this->parameters['mailer.password'], + 'ssl' => 'ssl', + 'port' => 465, + )); + } + + public function getMailer() + { + if (isset(self::$shared['mailer'])) + { + return self::$shared['mailer']; + } + + $class = $this->parameters['mailer.class']; + + $mailer = new $class(); + $mailer->setDefaultTransport($this->getMailTransport()); + + return self::$shared['mailer'] = $mailer; + } + } + +#+end_src + +*Ресурсы* +- Книга на 500+ страниц про Dependency Injection + https://livebook.manning.com/book/dependency-injection/ + +** DI фреймворки и библиотеки +*** PHP +- [[https://github.com/silexphp/Pimple][Pimple]] (Минималистичный DI контейнер) |