ドメイン駆動設計入門



構成例

ドメイン領域
・業務ロジックを実装する
・振る舞いを実装しない

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);
    }
}
Python

前の記事

Python PyInstaller