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, 0 insertions, 117 deletions
diff --git a/content/digarden/pages/20211210234818-dependency_injection.org b/content/digarden/pages/20211210234818-dependency_injection.org deleted file mode 100644 index fbac036..0000000 --- a/content/digarden/pages/20211210234818-dependency_injection.org +++ /dev/null @@ -1,117 +0,0 @@ -: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 контейнер) |