我目前拥有一个数据库中几乎每个表的存储库,我希望通过将它们简化为聚合根来进一步与DDD保持一致.

让我们假设我有下面的表,UserPhone.每个用户可能有一部或多部电话.如果没有聚合根的概念,我可能会这样做:

//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);

最后,假设我有几个查找表,它们实际上与任何东西都没有关联,比如CountryCodesColorsCodesSomethingElseCodes.我可能会用它们填充下拉列表,或者出于其他原因.这些是独立的存储库吗?它们可以组合成某种逻辑分组/存储库,比如CodesRepository吗?还是说这违背了最佳实践.

推荐答案

您可以在存储库中拥有任何想要的方法:)在您提到的两种情况下,返回用户并填充电话列表是有意义的.通常情况下,用户对象不会完全填充所有子信息(比如所有地址、电话号码),我们可能有不同的方法让用户对象填充不同类型的信息.这被称为延迟加载.

User GetUserDetailsWithPhones()
{
    // Populate User along with Phones
}

对于更新,在这种情况下,用户正在被更新,而不是电话号码本身.存储模式可能会将手机存储在不同的表中,这样你可能会认为手机正在更新,但如果你从DDD的Angular 考虑,情况并非如此.就可读性而言

UserRepository.Update(user)

单靠它并不能传达正在更新的内容,上面的代码可以清楚地显示正在更新的内容.此外,它很可能是前端方法调用的一部分,该调用可能表示正在更新的内容.

对于查找表,实际上甚至是其他表,使用GenericRepository并使用它是很有用的.自定义存储库可以从GenericRepository继承.

public class UserRepository : GenericRepository<User>
{
    IEnumerable<User> GetUserByCustomCriteria()
    {
    }

    User GetUserDetailsWithPhones()
    {
        // Populate User along with Phones
    }

    User GetUserDetailsWithAllSubInfo()
    {
        // Populate User along with all sub information e.g. phones, addresses etc.
    }
}

搜索通用存储库实体框架,您会发现许多不错的实现.使用其中的一个,或者编写您自己的.

Asp.net相关问答推荐

无法在Microsoft Windows Server 2016(数据中心)上运行.NET可移植性分析器

使用 aspnet core SignalR 客户端为 VSIX 项目.

如何在编译时为我的 ASP.NET 项目中的每个控制器生成一个单独的 OpenAPI Swagger.json 文件?

在 AppConfig.json 中存储对象的最佳方式

ASP .Net Web API 将图像下载为二进制

为什么微软决定支持 jQuery 如此重要?

/应用程序中的服务器错误. ASP.NET

MSCharts找不到请求类型'GET'的http处理程序错误

使用 C# 和 ASP.NET 从 Gmail/Hotmail/Yahoo 导入通讯簿

部署后网站需要强制刷新

如何设置 CSS 切换器

如何获取 ActionLink 的工具提示?

.NET 上的 HTTP/2(HTTP2 或 SPDY)

应该如何使用 RedirectToRoute?

asp.net 网站上的第一页加载缓慢

.Net System.Mail.Message 添加多个收件人地址

如何从 ASP.NET Identity 获取用户列表?

如何使用 WebAPI 处理图像

System.Drawing.Image.FromFile() 上的内存不足异常

jQuery Ajax 调用 - 成功设置变量值