我有一個如何更好地組織實現以下功能的問題。 假設用戶需要登錄到系統唯一電子郵件和密碼(第一步),然後他應該確認註冊(第二步)。我有幾種選擇來構建應用程序服務/域服務/ 用戶實體之間的第一步(註冊)的實現,我不確定哪一個更好。域驅動設計:允許應用程序服務中的邏輯
第一種選擇:
AppService服務:
var existingUser = UserRepository.GetUserByEmail(email);
if (existingUser != null)
{
throw new ValidationException(...);
}
var newUser = UserFactory.CreateUser();
newUser.Register(email, password);
UserRepository.Save(newUser);
// commit
所以在這裏,我們不使用任何域服務。我個人感覺不舒適的是在應用服務中檢查了電子郵件唯一性業務規則,這是一個業務規則。
第二個選項:
AppService服務:
var user = UserRegistrationDomainService.RegisterUser(email, password);
UserRepository.Save(user);
// commit
UserRegistrationDomainService:
User RegisterUser(email, password)
{
var existingUser = UserRepository.GetUserByEmail(email);
if (existingUser != null)
{
throw new ValidationException(...);
}
var newUser = UserFactory.CreateUser();
newUser.Register(email, password);
return newUser;
}
我不喜歡這裏,是,這個解決方案是不與實現完全對稱第二步,我們只需從存儲庫獲取用戶並調用User.ConfirmRegistration()。因此,對於註冊確認,我們不需要任何域名服務,而對於註冊,我們使用此類服務。
哪個選項更好?第一個選項的應用程序服務能否包含電子郵件唯一性驗證?
這屬於「會員」系統的門面,是一個服務或其他東西。我已經讀過這本書並且練習了這些單詞,但是我已經認識到,如果不很好理解,DDD會造成傷害。它促使程序員應用「配方」,因爲他們會設計模式,而不是爲當前的問題創建解決方案。 – 2012-05-30 08:31:31