我理解依赖注入的基本原则,但想要一些关于如何处理在其他类方法中实例化的类的建议;这与依赖注入模式背道而驰吗?
此外,我希望将对象(类)写入DB (mongo in object form),因此不希望它与其他依赖关系膨胀。
为了更好地解释我的意思,这里有一个例子:
假设我们有一个用户类被注入一个服务器类-
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();
}
}所以这有两件事
我理解的一种方法是在从外部控制器调用时将mailer类注入delete函数,这意味着用户类永远不需要注入服务器类:
$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是一个私有方法,会发生什么情况?首先,您无法从外部控制器调用它来传递mailer对象。
所以我的问题是什么是最好的方式去做这件事?
发布于 2014-10-17 12:09:43
对我来说,依赖于一个对象是一种感觉,这样你就可以构造一个不同的对象。
相反,使用要构造的对象的依赖项。因此,在您的情况下,只需将一个mailer传递给您的User构造函数,那么您就不需要创建一个mailer,也不需要关心服务器。
在这里,您的User依赖于邮件程序(用于邮件),因此这就是应该注入的内容。
您的对象应该只创建叶对象/数据持有者/DTOs的新实例。任何提供任何功能(即服务)的东西都应该注入到需要使用该功能的对象中。
编辑
我不做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用户想要删除一个用户时,期望他们提供一个邮件程序是否合理。对我来说,听起来并不是这样,所以我会通过构造函数传递它。
https://stackoverflow.com/questions/26424690
复制相似问题