我目前为数据库中的每个表都有一个存储库,并希望通过将它们减少到仅聚合根来进一步遵循DDD。
假设我有以下表:User
和Phone
。每个用户可能拥有一个或多个电话。没有聚合根的概念,我可能会这样做:
//assuming I have the userId in session for example and I want to update a phone number
List<Phone> phones = PhoneRepository.GetPhoneNumberByUserId(userId);
phones[0].Number = “911”;
PhoneRepository.Update(phones[0]);
在实践中,聚合根的概念比纸上理解起来更具挑战性。因为我永远不会有不属于用户的电话号码,所以取消PhoneRepository并将与电话相关的方法合并到UserRepository中是否有意义呢?假设答案是肯定的,那么我将重写之前的代码示例。
我的UserRepository中是否可以有一个返回电话号码的方法?还是应该始终返回对用户的引用,然后通过用户遍历关系以获取电话号码:
List<Phone> phones = UserRepository.GetPhoneNumbers(userId);
// Or
User user = UserRepository.GetUserWithPhoneNumbers(userId); //this method will join to Phone
不管我以哪种方式获取电话,假设我修改了其中一个,我该如何更新它们? 我的了解有限,但我知道根目录下的对象应该通过根目录来更新,这会引导我选择下面的第一种方法。虽然这在实体框架中完全可行,但似乎非常不具描述性,因为读取代码时,我无法知道我实际上正在更新什么,尽管实体框架正在跟踪图形中已更改的对象。
UserRepository.Update(user);
// Or
UserRepository.UpdatePhone(phone);
最后,假设我有几个查找表并且它们与任何其他内容都没有真正联系,例如 CountryCodes、ColorsCodes、SomethingElseCodes。我可能会使用它们来填充下拉列表或出于其他任何原因。这些是独立的存储库吗?它们可以组合成某种逻辑分组/存储库,例如 CodesRepository 吗?还是说这违反了最佳实践?