我目前拥有一个数据库中几乎每个表的存储库,我希望通过将它们简化为聚合根来进一步与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
不管我以何种方式获得手机,假设我修改了其中一部,我该如何更新它们?我有限的理解是,根下的对象应该通过根更新,这将 bootstrap 我 Select 下面的选项#1.尽管这在Entity Framework中可以很好地工作,但这似乎非常不具描述性,因为阅读代码时,我不知道自己实际上在更新什么,尽管Entity Framework一直在跟踪图中已更改的对象.
UserRepository.Update(user);
// Or
UserRepository.UpdatePhone(phone);
最后,假设我有几个查找表,它们实际上与任何东西都没有关联,比如CountryCodes
、ColorsCodes
、SomethingElseCodes
.我可能会用它们填充下拉列表,或者出于其他原因.这些是独立的存储库吗?它们可以组合成某种逻辑分组/存储库,比如CodesRepository
吗?还是说这违背了最佳实践.