summaryrefslogtreecommitdiff
path: root/content/digarden/pages/20211210234818-dependency_injection.org
diff options
context:
space:
mode:
Diffstat (limited to 'content/digarden/pages/20211210234818-dependency_injection.org')
-rw-r--r--content/digarden/pages/20211210234818-dependency_injection.org117
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 контейнер)