Инъекция зависимости / LoD

Я понимаю основные принципы внедрения зависимостей, но хотел бы получить несколько советов о том, как обрабатывать классы, созданные в других методах классов; это идет вразрез с шаблоном внедрения зависимостей?

Более того, я хотел бы записать объект (класс) в БД (монго в форме объекта) и поэтому не хочу, чтобы он был раздут с другими зависимостями.

Чтобы лучше объяснить, что я имею в виду, вот пример:

Допустим, у нас есть пользовательский класс, который внедряется с классом сервера —

class User{
public $user_id
public $user_name;

public function __construct(server $server){
$this->server = $server;
}

public function delete(){
//...delete user code

// Send mail to user
$mailer = new mailer($this->server);
$mailer->sendMail();
}

}

Итак, две вещи об этом

  1. Это означает, что класс User теперь раздут, поскольку он также содержит класс сервера.
  2. Это нарушает закон Деметры? Поскольку класс User на самом деле не нуждается в классе Server, кроме как для передачи его в класс Mailer.

Я понимаю, что можно обойти это путем внедрения класса почтовика в функцию удаления при вызове из внешнего контроллера, что означает, что класс User никогда не должен вводиться с классом сервера:

$server = new server();
$mailer = new mailer($server);
$user = new User();
$user->delete($mailer);

class User{
public $user_id
public $user_name;

public function __construct(){
// other code
}

public function delete(mailer $mailer){
//...delete user code

// Send mail to user
$mailer->sendMail();
}

}

Но, безусловно, это означает, что вам нужно будет знать каждый класс, необходимый для методов внутри класса, если эта вложенность станет глубиной в несколько уровней, конечно, это будет трудно отследить.

И что произойдет, если user-> delete является приватным методом? Вы не сможете вызвать его из внешнего контроллера, чтобы передать объект почтовой программы в первую очередь.

Так что мой вопрос на самом деле заключается в том, как лучше всего это сделать?

0

Решение

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

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

Здесь твой User имеет зависимость от почтовой программы (для отправки по почте), и это то, что должно быть введено.

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

РЕДАКТИРОВАТЬ

Я не делаю PHP, но я думаю, что ваш пользовательский класс должен выглядеть примерно так:

class User{
public $user_id
public $user_name;

public function __construct(mailer $mailer){
$this->mailer = $mailer;
}

public function delete(){
//...delete user code

// Send mail to user
$this->mailer->sendMail();
}
}

Что касается внедрения через конструктор против передачи в метод, то это сводится к тому, разумно ли ожидать пользователя вашего User поставщику почтовой программы, когда они хотят удалить пользователя. Для меня это звучит не так, так что я бы пропустил это через конструктор.

0

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]