DDDを使用して単純なドメインをモデル化しようとしています。データベースレイヤーはEntityFrameworkを使用して実装され、ドメインオブジェクトはPOCOです。ドメインには、FirstName、LastName、およびUsernameプロパティを持つUserエンティティがあります。したがって、ドメインはユーザーのリポジトリを処理するIRepositoryを定義します。
ドメインロジックの1つの要件は、同じユーザー名を持つ2人のユーザーが存在できないことです。したがって、同じユーザー名を持つ別のユーザーがすでに存在するときに新しいユーザーを追加しようとすると、例外がスローされます。
IUnitOfWork unitOfWork = new UnitOfWork();
IRepository<User> users = unitOfWork.Users;
User user1 = new User() { Username = "jsmith", FirstName = "John", LastName = "Smith" };
users.Add(user1);
users.Save(); // ok, new user added to the underlying database
User user2 = new User() { Username = "jsmith", FirstName = "Jim", LastName = "Smith" };
users.Add(user2); // exception here?
users.Save(); // or exception here?
これは、新しいユーザーを追加するWPFアプリケーションに入力する必要があるコードの例です。ここで、UnitOfWorkはEntityFrameworkのDbContextオブジェクトをカプセル化します。
私の質問は、このドメインルールをどこでどのように適用する必要があるかです。ユーザーをリポジトリに追加しようとしたとき、またはSave()メソッドが呼び出されたときに、例外をスローする必要がありますか?新しいユーザーを追加するためのドメインサービスを作成し、そこですべてのドメインロジックルールを処理する必要がありますか?
また、どのような例外をスローする必要がありますか?DuplicateUserExceptionなどのカスタムドメイン例外を作成する必要がありますか?