在 DDD 中跨多个存储库查询数据

Query data across multiple repositories in DDD

我在 DDD 有界上下文中使用多个聚合根。

例如

public class OrderAggregate
{
    public int ID {get;set;}
    public string Order_Name {get;set;}
    public int Created_By_UserID {get;set;}
}

public class UserAggregate
{
    public int ID {get;set;}
    public string Username {get;set;}
    public string First_Name {get;set;}
    public string Last_Name {get;set;}
}

我正在使用 SQL 关系库来持久化域对象。每个聚合根匹配一个存储库。

如果我想查找由 John Doe 创建的订单(跨多个聚合搜索),DDD 方法是什么?


public class QueryOrderAggregate
{
    public int ID { get; set; }
    public string Order_Name { get; set; }
    public int Created_By_UserID { get; set; }
    public string First_Name { get; set; }
    public string Last_Name { get; set; }
}

In case I would like to find an order that was created by John Doe (seach accross multiple aggregates) what would be a DDD way to go?

几乎与访问聚合的方式相同...

您创建了一个存储库,它提供了一个(无论这个 view/report 在您的域中的名称是什么)。它可能使用 UserId 作为识别报告的键。在存储库的实现中,实现可以做任何有意义的事情——SQL 连接是一个合理的起点。

View/Report基本上是一个值类型;它是不可变的,可以提供数据,但没有任何方法,也没有任何对聚合根的直接访问。例如,视图可能包含 OrderId,但要实际获取订单聚合根,您必须调用 that 存储库上的方法。

跨越多个聚合的视图是完全可以接受的,因为您实际上无法使用该视图修改任何内容。对底层状态的更改仍然通过聚合根,它提供了一致性保证。

该视图表示您的数据的陈旧快照。消费者不应期望它会神奇地更新——如果您想要更新的内容,请返回存储库获取新副本。