最佳答案
目前,我拥有一个存储库,可以存储数据库中的几乎每一个表,我希望通过将 DDD 减少到仅聚合根来进一步使自己与 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
不管我用哪种方式获得这些手机,假设我修改了其中一个,我如何着手更新它们?我有限的理解是,根目录下的对象应该通过根目录进行更新,这将引导我走向下面的选项 # 1。虽然这在实体框架中可以很好地工作,但是这似乎非常不具有描述性,因为阅读代码时,我不知道我实际上在更新什么,即使实体框架保留了图中已更改对象的选项卡。
UserRepository.Update(user);
// Or
UserRepository.UpdatePhone(phone);
最后,假设我有几个查找表,它们并没有真正绑定到任何东西,比如 CountryCodes
、 ColorsCodes
、 SomethingElseCodes
。我可能会用它们来填充下拉列表或者其他什么原因。这些是独立存储库吗?它们是否可以组合成某种逻辑分组/存储库,例如 CodesRepository
?还是违背了最佳实践。