ドメイン駆動設計入門
目次
構成例
ドメイン領域
・業務ロジックを実装する
・振る舞いを実装しない
Domein
┗ UserService
リポジトリ
Repository
┗ UserRepository
アプリケーション領域
・業務ロジックを実装しない
・振る舞いを実装する
Application
┗ Users
┗ UserRegisterService
┗ UserGetService
┗ UserUpdateService
┗ UserDeleteService
単純なCRUD処理であればリポジトリを利用
業務ロジックを必要とする場合はUserServiceを利用
ドメインオブジェクトの利用
ドメインオブジェクト
class User { private UserName name; private UserId id; public User(UserName name) { if (name == null) { throw new ArgumentNullException("name"); } this.name = name; this.id = new UserId(); } }
値オブジェクト
class UserId { private Guid value; public UserId() { this.value = Guid.NewGuid(); } } class UserName { private String value; public UserName(String value) { if (value == null) { throw new ArgumentNullException("value"); } if (value.length 〜) { throw new 〜; } this.value = value; } }
ドメインサービス
class UserService { public boolean exists(User user) { // Check if the user already exists } public void register(User user) { // Register the user } }
アプリケーションサービス
class ApplicationService { const user = new User(new UserName("YONE")); CONST userService = new UserService(); if (userService.exists(user)) throw new Error("User already exists"); userService.register(user); }
リポジトリの利用
インターフェース
public interface IUserRepository { void Save(User user); User Find(UserName name); }
リポジトリ
public class userRepositoryImpl : IUserRepository { public void Save(User user) { // Save user to database } public User Find(UserName name) { // Find user from database } }
ドメインサービス
class UserService { private IUserRepository userRepository; public UserService(IUserRepository userRepository) { this.userRepository = userRepository; } public boolean Exists(User user) { return userRepository.where(user.〜) .where(user.〜) .where(user.〜) !== null; } }
アプリケーションサービス
class ApplicationService { private IUserRepository userRepository; public ApplicationService(IUserRepository userRepository) { this.userRepository = userRepository; } public void CreateUser(string name) { var user = new User(new UserName(name)); var userService = new UserService(userRepository); if (userService.Exists(user)) { throw new Exception("User already exists"); } userService.Save(user); } }