Внедрение зависимости - есть ли альтернатива этому очень большому конструктору? - PullRequest
3 голосов
/ 29 октября 2010

Вскоре я решил использовать технику внедрения зависимостей для нового PHP-приложения, которое я собираюсь написать.

Однако я не совсем уверен, что понимаю его достаточно.Моя проблема в том, что базовый класс зависит от различных элементов, в то время как для его расширения потребуется много разных классов.Например:


namespace system;

class baseClass
{
 protected $logger;
 protected $filter;
 protected $database;
 protected $session;


 public function __construct(LoggerInterface $logger, filterInterface $filter, databaseInterface $database, sessionInterface $session)
 {
  $this->logger = $logger;
  $this->filter = $filter;
  $this->database = $database;
  $this->session = $session;
 }
}

Большинству классов понадобится регистратор, фильтр и т. Д. Для выполнения своей работы: например, класс фильтра обрабатывает экранирование / проверку, что мне понадобится во всем проекте.

Проблема, которую я предсказываю, состоит в том, что когда (почти) все объекты расширяют этот базовый класс, каждый раз, когда мне нужно создать экземпляр даже довольно простого класса (но не настолько простого, чтобы, конечно, не нуждаться в элементах, описанных выше), с которыми я сталкиваюськонструктор, который может принимать много параметров.

Когда, например, создается объект класса 'car', для меня это будет нормально:


$car = new Car($color,$amountOfWheels);

, но это выглядит довольногрязно для меня:


$car = new Car($logger, $filter, $database, $session, $color, $amountOfWheels);

Я ищу решение этой проблемы, не нарушая, конечно, парадигму DI.Может быть, поможет какой-то шаблон фабрики, но создание фабричного класса для каждого маленького объекта кажется мне немного излишним ..?

1 Ответ

4 голосов
/ 29 октября 2010

Как насчет использования объекта DbContext:

$dbContext = new DbContext($logger, $filter, $database, $session);

Тогда ваш "Автомобиль":

$car = new Car($dbContext, $color, $amountOfWheels);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...