source: content/digarden/pages/20211210234818-dependency_injection.org@ 972a737

Last change on this file since 972a737 was 972a737, checked in by w96k <w96k@…>, on Apr 16, 2023 at 5:54:55 PM

Add logseq

  • Property mode set to 100644
File size: 3.4 KB
Line 
1:PROPERTIES:
2:ID: 49387584-0ee5-42ab-bc90-648062e74a91
3:END:
4#+title: Dependency Injection
5* Dependency Injection
6Часть инверсии контроля, которая занимается инициализацией объектов и их
7зависимостей обычно в единственном экземпляре. Объекты обычно передают в
8аргументах функций-конструкторов класса, а штука находящая объекты
9называется сервис-локатором.
10
11Суть паттерна заключается в том, чтобы не инициализировать лишний раз в
12конструкторе объекты вручную и не инициализировать лишний раз экземпляры
13классов в принципе (IoC).
14
15*Сервис-контейнер* -- класс, инициализирующий различные объекты, которые в
16последствии хранит в одном из своих полей.
17
18*Сервис* -- объекты, управляемые сервис-контейнером.
19
20*Реализации:*
21+ Java
22 http://picocontainer.com/
23+ Python
24 https://github.com/ets-labs/python-dependency-injector
25
26*PHP и Symfony:*
27http://fabien.potencier.org/what-is-dependency-injection.html
28+ Dependency Injection без контейнеров
29#+begin_src php
30 class User
31 {
32 function __construct($storage)
33 {
34 $this->storage = $storage;
35 }
36
37 // ...
38 }
39
40 $storage = new SessionStorage('SESSION_ID');
41 $user = new User($storage);
42#+end_src
43
44+ Реализация возврата объекта в единственном экземпляре
45#+begin_src php
46 class Container
47 {
48 static protected $shared = array();
49
50 // ...
51
52 public function getMailer()
53 {
54 if (isset(self::$shared['mailer']))
55 {
56 return self::$shared['mailer'];
57 }
58
59 $class = $this->parameters['mailer.class'];
60
61 $mailer = new $class();
62 $mailer->setDefaultTransport($this->getMailTransport());
63
64 return self::$shared['mailer'] = $mailer;
65 }
66 }
67#+end_src
68
69+ Реализация сервис-контейнера
70#+begin_src php
71 class Container
72 {
73 static protected $shared = array();
74
75 protected $parameters = array();
76
77 public function __construct(array $parameters = array())
78 {
79 $this->parameters = $parameters;
80 }
81
82 public function getMailTransport()
83 {
84 return new Zend_Mail_Transport_Smtp('smtp.gmail.com', array(
85 'auth' => 'login',
86 'username' => $this->parameters['mailer.username'],
87 'password' => $this->parameters['mailer.password'],
88 'ssl' => 'ssl',
89 'port' => 465,
90 ));
91 }
92
93 public function getMailer()
94 {
95 if (isset(self::$shared['mailer']))
96 {
97 return self::$shared['mailer'];
98 }
99
100 $class = $this->parameters['mailer.class'];
101
102 $mailer = new $class();
103 $mailer->setDefaultTransport($this->getMailTransport());
104
105 return self::$shared['mailer'] = $mailer;
106 }
107 }
108
109#+end_src
110
111*Ресурсы*
112- Книга на 500+ страниц про Dependency Injection
113 https://livebook.manning.com/book/dependency-injection/
114
115** DI фреймворки и библиотеки
116*** PHP
117- [[https://github.com/silexphp/Pimple][Pimple]] (Минималистичный DI контейнер)
Note: See TracBrowser for help on using the repository browser.