source: content/digarden/20211210234818-dependency_injection.org@ 5a2b670

Last change on this file since 5a2b670 was 5a2b670, checked in by Mikhail Kirillov <w96k@…>, on Oct 6, 2022 at 12:37:40 PM

Add digital garden

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