在 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 方法是什么?
将First_Name和Last_Name添加到OrderAggregate中,以便在OrderRespository中添加FindByUserFirstLastName方法,但这可能会引发两个聚合根之间的数据一致性问题
创建原始 sql 查询并直接访问数据库,以便跨 "repositories"
进行搜索
使用 "finders" 以便直接从 DB
加入实体
将完成查询所需的数据复制到新的聚合根,例如
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 存储库上的方法。
跨越多个聚合的视图是完全可以接受的,因为您实际上无法使用该视图修改任何内容。对底层状态的更改仍然通过聚合根,它提供了一致性保证。
该视图表示您的数据的陈旧快照。消费者不应期望它会神奇地更新——如果您想要更新的内容,请返回存储库获取新副本。
我在 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 方法是什么?
将First_Name和Last_Name添加到OrderAggregate中,以便在OrderRespository中添加FindByUserFirstLastName方法,但这可能会引发两个聚合根之间的数据一致性问题
创建原始 sql 查询并直接访问数据库,以便跨 "repositories"
进行搜索
使用 "finders" 以便直接从 DB
加入实体
将完成查询所需的数据复制到新的聚合根,例如
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 存储库上的方法。
跨越多个聚合的视图是完全可以接受的,因为您实际上无法使用该视图修改任何内容。对底层状态的更改仍然通过聚合根,它提供了一致性保证。
该视图表示您的数据的陈旧快照。消费者不应期望它会神奇地更新——如果您想要更新的内容,请返回存储库获取新副本。