gpt4 book ai didi

asp.net-mvc-3 - 获取所有聚合根实体子实体?

转载 作者:行者123 更新时间:2023-12-04 17:56:45 25 4
gpt4 key购买 nike

我正在尝试将我的应用程序从每个实体的存储库重构为每个聚合根的存储库。

一个基本的例子是我有一个 Cars 的实体根。汽车有租赁契约(Contract)。据我所知,没有汽车就没有契约(Contract),因此汽车是总根。

我正在尝试实现一个用户 View ,它将显示系统中的每个契约(Contract)(根实体的所有子实体)。在重构之前,我可以去我的合约存储库并获取所有。由于契约(Contract)存储库已被删除(因为它不是根),我现在需要将所有汽车从我的存储库中取出,然后获取他们的所有契约(Contract)。

我的存储库有接口(interface)

public interface ICarRepository
{
IQueryable<Car> All { get; }
IQueryable<Car> AllIncluding(params Expression<Func<Car, object>>[] includeProperties);
Car Find(long id);
void InsertOrUpdate(Car car);
void Delete(long id);
void Save();
}

我想创建一个 ICarManagementService 并让它有一个 GetAllContracts 方法(可能带有过滤器参数)。这是否意味着获得我需要的所有契约(Contract),将所有汽车实体与他们的契约(Contract)一起取出,然后检索与租赁契约(Contract)相关的每个实体并过滤它们?

然后我可以将这些传递给 Controller ​​并像以前一样自动映射契约(Contract)。

这是最佳实践吗?

谢谢

格雷姆

最佳答案

As far as I can see contracts don't exist without cars hence cars is the aggregate root.



这不一定是真的。 “不存在”不足以让实体成为聚合根的一部分。考虑经典的订单处理领域。您有一个作为聚合根的订单。您还有一个作为聚合根的客户。没有客户订单就不能存在,但这并不意味着订单是客户集合的一部分。在一个聚合内的 DDD 实体中,可以引用其他聚合根。来自 DDD book :

Objects within the AGGREGATE can hold references to other AGGREGATE roots.



聚合是一个生命周期和数据交换单元。它本质上是一组强制执行不变量的对象。如果您有多个用户同时更改域,则这是您想要锁定的内容。

回到您的问题,我的理解是,该域类似于出租/租赁汽车/卡车/豪华轿车/推土机。我认为 HireContract 可能不是 Car 聚合的一部分,因为它们可能有不同的生命周期,而 HireContract 本身就有意义,没有 Car。它似乎更像是订单-产品关系,这也是两个不同聚合相互引用的经典示例。业务需要查看“所有契约(Contract)”这一事实也证实了这一理论。他们可能不认为 Car 包含所有契约(Contract)。如果这是真的,那么您需要保留您的 ContractsRepository。

在不相关的注释中,您可能有兴趣阅读此 answer关于存储库界面设计。

关于asp.net-mvc-3 - 获取所有聚合根实体子实体?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7460952/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com