ふーーーむ

書籍「ドメイン駆動」のリポジトリの作りがどうも気に入らない。
こんな風*1にするのはどうだろう。

public abstruct class Repository
{
    public UserRepository OfUser
    {
        get
        {
            return this.CreateUserRepository();
        }
    }
    protected abstruct UserRepository CreateUserRepository();

    public abstract void PersistAll();
}

public abstruct class UserRepository
{
    public OperatorRepository WhoCanOperate
    {
        get
        {
            return this.CreateOperatorRepository();
        }
    }
    protected abstruct OperatorRepository CreateOperatorRepository();

    // 該当利用者がオペレーターならば、Operator のインスタンスが返される。
    public abstruct User GetById(string id);
}

public abstruct class OperatorRepository
{
    public abstruct Operator GetById(string id);
}

使用する時はこんな風に書ける。

Repository repository = CreateRepository();
User user = repository.OfUser.GetById("user01");
Operator operator = repository.OfUser.WhoCanOperate.GetById("operator01");

うーん、OfUser とか WhoCanOperate なんてのはやっぱ微妙かw
でも、リポジトリの作り自体は、結構気に入ったんだけどなぁ。この場合、ユニットオブワークや一意マッピングを保持するための NWorkspace が、(少なくともこの基本クラスのレベルでは) 登場しないし。
そうだ、
OfUser → Users
WhoCanOperate → Operators
にしてみたらどうだろ。

Repository repository = CreateRepository();
User user = repository.Users.GetById("user01");
Operator operator = repository.Users.Operators.GetById("operator01");

んー、とりあえずこれでやってみるか。

*1:利用者とオペレータについては、
-システムに登録されている人は全て利用者である
-オペレータクラスは利用者クラスを継承、つまり 「Operator is a user」
とする。でもこの定義自体はあまり重要ではない。