【发布时间】:2013-04-04 20:36:22
【问题描述】:
这是一个独立于语言的问题,但我用 PHP 编写示例代码。
我们有两个类:
- 用户类
- UserRepository 类
UserRepository 类处理与 DB 的交互并将所需的 User 加载到 User 对象中并返回它。
在 User 类中,假设有一个 email 属性一开始就没有加载,它会在需要时从数据库中延迟加载。 但是 User 类不应该知道 UserRepository 类,所以我们在这里创建一个电子邮件代理。它知道 UserRepository 并且无论何时需要电子邮件,它都会从 UserRepository 询问它。
所以这是到目前为止的代码:
用户类
class User
{
private $username;
private $email_proxy;
public function __construct($username,EmailProxy $email_proxy)
{
$this->username = $username;
$this->email_proxy = $email_proxy;
}
public function get_username()
{
return $this->username;
}
public function get_email()
{
return $this->email_proxy->get_email($this->get_username());
}
}
UserRepository 类
class UserRepository
{
private $db;
public function __construct($db)
{
$this->db = $db;
}
/**
* @param string username
* @return string email , email address of the user
*/
public function get_email_by_username($username)
{
// interaction with DB, ...
return $user_email;
}
}
邮件代理类
class EmailProxy
{
private $user_repository;
public function __construct(UserRepository $repository)
{
$this->user_repository = $repository;
}
public function get_email($username)
{
return $this->user_repository->get_email_by_username($username);
}
}
这是使用示例:
$user_repository = new UserRepository($db_instance);
$email_proxy = new EmailProxy();
$user = new User('my_username', $email_proxy);
到目前为止一切顺利。 但这是我需要你帮助的棘手部分。 从本质上讲,UserRepository 应该负责从 DataBase 中获取 User 对象,构造 User 对象并返回它。如下所示:
class UserRepository
{
private $db;
public function __construct($db)
{
$this->db = $db;
}
public function get_email_by_username($username)
{
// interaction with DB, ...
return $user_email;
}
public function get_user_by_username($username)
{
// fetch the User from DB and ...
return new User($fetched_username) // missing the EmailProxy
}
}
所以我的问题是如何将 EmailProxy 传递给由 UserRepository 创建的 User 对象?
您是否将 UserProxy 实例注入到 UserRepository 以便可以将其注入到新创建的 User 对象中?
您会为此使用依赖注入容器吗?
你会使用工厂吗?
编辑
EmailProxy 已经知道 UserRepository,如果我们也将 EmailProxy 传递给 UserRepository,它将是循环依赖。
任何代码/cmets 将不胜感激。
谢谢,
【问题讨论】:
标签: language-agnostic dependency-injection lazy-loading factory proxy-pattern