ドメインオブジェクトの永続化と再構築を担うパターン。
なんらかのデータストアと直接やりとりする。
class Program
{
private IUserRepository userReopsitory;
public Program(IUserRepository userRepository){
this.userRepository = userRepository;
}
public void CreateUser(string userName){
var user = new User(new UserName(userName));
var userService = new UserService(userRepository);
if (userService.Exists(user)) { // Existsは実際の重複チェックをリポジトリ経由で行う
throw new Exception();
}
userRepository.Save(user); // どこのデータストアに保存されるかに関心を持たない
}
}- ※ Existsをリポジトリに実装するのはNG?
- NG。リポジトリの責務である「永続化」の範疇を超えているため。
- 重複チェックはドメインルールに近いので、ドメインサービスが行うべき。
リポジトリの実装
- Interfaceを用意し、Find, Saveなどのメソッドを定義する
- ユースケースが特定のインフラに依存しないようにするため、抽象型を使う
- SQLRepository
- InMemoryRepository(テスト用)
- ORMRepository など
- ユースケースが特定のインフラに依存しないようにするため、抽象型を使う
public interface IUserRepository
{
void Save(User user);
User Find(UserName name)
}- 永続化に関するふるまいを定義(メソッド名は任意)
Save(Entity)- 個別のフィールドのUpdateは実装しない。updateName, updateEmail…と膨らんでいくため
- そういった変更のふるまいはエンティティにもたせる
Delete(Entity)
- 再構築に関するふるまいを定義(メソッド名は任意)
Find(Identity)FindAll()FindByHoge(Fuga)(特定の探索に特化)- 可能なら、Findをオーバーロードする手段もある