Typy Dependency Injection
Nejvíce používané typy Dependency Injection jsou:
- Constructor injection
- Setter injection
- Interface injection
Constructor injection
Závislosti vkládáme v konstruktoru třídy.
$author = new Author('John', 'Doe'); $book = new Book('Some legendary book', $author);
Setter injection
Závistlosti vkládáme pomocí setter metody třídy.
$author = new Author('John', 'Doe'); $book = new Book(); $book->setAuthor($author); $book->setTitle('Some legendary book');
Interface injection
Klient používá pro vložení závislostí rozhraní (interface).
Dependency injection container
Ve velkých projektech s mnoha třídami spravujeme závislosti pomocí dependency injection kontejneru.
Příklad použití dependency injection
Třída Author:
class Author { /** * @var string */ private $firstName; /** * @var string */ private $lastName; /** * Constructor. * * @param string $firstName * @param string $lastName */ public function __construct($firstName, $lastName) { $this->firstName = $firstName; $this->lastName = $lastName; } }
Třída Book:
Nevhodné řešení bez použití dependency injection:
class Book { /** * @var string */ private $title; /** * @var string */ private $author; /** * Constructor. * * @param string $firstName * @param string $lastName * @param string $title */ public function __construct($firstName, $lastName, $title) { $this->title = $title; $this->author = new Author($firstName, $lastName); } }
Problém psočívá v tom, že ve třídě Book vytváříme třídu Author.
Tím pádem porušujeme princip single responsibility. Třída Book by měla pouze reprezentovat knihu.
Třídě Book bychom měli předat již vytvořenou třídu Author.
Řešení s použití dependency injection:
class Book { /** * @var string */ private $title; /** * @var Author */ private $author; /** * Constructor. * * @param string $title * @param Author $author */ public function __construct($title, Author $author) { $this->title = $title; $this->author = $author; } }
Použití:
$author = new Author('John', 'Doe'); $book = new Book('Some legendary book', $author);