我正在尝试使用 DDD 对一个简单的域进行建模。数据库层使用实体框架实现,领域对象为 POCO。域具有具有 FirstName、LastName 和 Username 属性的用户实体。因此,域定义了为用户处理存储库的 IRepository。
现在域逻辑中的一个要求是不能存在具有相同用户名的两个用户。因此,当另一个具有相同用户名的用户已经存在时尝试添加新用户应该会引发异常。
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 封装了 Entity Framework 的 DbContext 对象。
我的问题是我应该如何以及在哪里执行此域规则?尝试将用户添加到存储库时或者调用 Save() 方法时是否应该抛出异常?我是否应该创建域服务来添加新用户,然后在那里处理所有域逻辑规则?
另外,我应该抛出什么异常?我应该创建一些自定义域异常,例如 DuplicateUserException 或类似的东西吗?