これは言語に依存しない質問ですが、PHP でサンプル コードを記述します。
2 つのクラスがあります。
- ユーザークラス
- UserRepositoryクラス
UserRepository クラスは、DB とのやり取りを処理し、必要な User を User オブジェクトにロードして返します。
User クラス内に、そもそもロードされないメール属性があり、必要なときにいつでもデータベースから遅延ロードされるとします。ただし、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;
}
}
EmailProxy クラス
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
}
}
私の質問は、UserRepositoryによって作成されたUserオブジェクトにEmailProxyを渡す方法です。
UserProxy インスタンスを UserRepository に注入して、新しく作成された User オブジェクトに注入できるようにしますか?
これに依存性注入コンテナーを使用しますか?
工場を利用しますか?
編集
EmailProxyはすでにUserRepository を認識しています。EmailProxyをUserRepositoryにも渡すと、循環依存になります。
コード/コメントをいただければ幸いです。
ありがとう、