Návrhové vzory: Dependency injection

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);

 

Napsat komentář

Vaše e-mailová adresa nebude zveřejněna. Vyžadované informace jsou označeny *