ふーーーむ
書籍「ドメイン駆動」のリポジトリの作りがどうも気に入らない。
こんな風*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」
とする。でもこの定義自体はあまり重要ではない。