假设我们有一个 Order 类型的聚合根实体,它将客户和订单行关联起来。当我考虑订单实体时,更自然地将其概念化为没有 ID 就没有定义。没有 Id 的订单似乎比订单更好地表示为订单请求。
要将订单添加到存储库,我通常会看到人们在没有 ID 的情况下实例化订单,然后让存储库完成对象:
class OrderRepository
{
void Add(Order order)
{
// Insert order into db and populate Id of new order
}
}
我喜欢这种方法的地方在于,您正在向 OrderRepository 添加一个 Order 实例。这很有意义。但是,订单实例没有 Id,并且在存储库的消费者范围内,订单没有 Id 对我来说仍然没有意义。我可以将 OrderRequest 定义为 order 的实例并将其添加到存储库中,但这感觉就像从橙子中派生出一个苹果,然后将其添加到橙子列表中。
或者,我也看到了这种方法:
class OrderRepository
{
Order AddOrder(Customer customer)
// It might be better to call this CreateOrder
{
// Insert record into db and return a new instance of Order
}
}
我喜欢这种方法的地方在于,没有 ID 的订单是未定义的。存储库可以在创建和返回订单实例之前创建数据库记录并收集所有必需的字段。这里闻起来的事实是,您实际上从未将订单实例添加到存储库中。
无论哪种方式都有效,所以我的问题是:我是否必须接受这两种解释中的一种,或者是否有最佳实践来模拟插入?
我发现这个答案是相似的,但对于值对象: 我应该如何将对象添加到由聚合根维护的集合中。当涉及到一个值对象时,没有混淆,但我的问题涉及一个具有从外部源(自动生成的数据库 ID)派生的身份的实体。