目前,我几乎为数据库中的每个表都拥有一个存储库,并希望通过减少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前进。尽管这可以很好地与Entity Framework一起很好地工作,但这似乎没有什么描述性,因为即使Entity Framework在图形中更改对象的选项卡上,阅读代码我也不知道我实际更新的内容。
UserRepository.Update(user);
// Or
UserRepository.UpdatePhone(phone);
最后,假设我有几个查阅表中并没有真正依赖于任何东西,如CountryCodes
,ColorsCodes
,SomethingElseCodes
。我可能会用它们来填充下拉列表或其他原因。这些是独立存储库吗?它们可以组合成某种逻辑分组/存储库CodesRepository
吗?还是说这违反了最佳实践。