ドメイン駆動設計入門
目次
構成例
ドメイン領域
・業務ロジックを実装する
・振る舞いを実装しない
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);
}
}


