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

Asp.net mvc 3 获取所有聚合根实体子实体?,asp.net-mvc-3,domain-driven-design,ddd-repositories,service-layer,aggregateroot,Asp.net Mvc 3,Domain Driven Design,Ddd Repositories,Service Layer,Aggregateroot,我正在尝试将应用程序从每个实体的存储库重构为每个聚合根的存储库 一个基本的例子是我有一个汽车的实体根。汽车有租赁合同。据我所知,没有汽车合同是不存在的,因此汽车是总根 我试图实现一个用户视图,它将显示系统中的每个契约(根实体的所有子实体)。在重构之前,我可以直接去我的合同存储库获取所有信息。由于合同存储库已被删除(因为它不是根目录),我现在需要将所有汽车从存储库中取出,然后获取它们的所有合同 我的存储库有一个接口 public interface ICarRepository { IQu

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

一个基本的例子是我有一个汽车的实体根。汽车有租赁合同。据我所知,没有汽车合同是不存在的,因此汽车是总根

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

我的存储库有一个接口

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();
}
公共接口ICarRepository
{
IQueryable所有{get;}
可计量的所有包括(参数表达式[]包括属性);
车辆查找(长id);
无效插入更新(汽车);
作废删除(长id);
作废保存();
}
我考虑创建一个iCarmanManagementService,并让它有一个GetAllContracts方法(可能带有过滤器参数)。这是否意味着要获得所有合同,我需要将所有汽车实体与其合同一起取出,然后检索与租赁合同相关的每个实体并对其进行筛选

然后我可以将这些信息传递给控制器,并像以前一样自动映射合同

这是最佳实践吗

谢谢


Graeme

将读/查询的概念与写/命令分开,按照CQRS的指导,最好通过分离由只读查询组成的读模型和由在域模型上执行特定逻辑的命令组成的写模型来设计应用程序

因此,查询所有聚合根或创建自定义查询以连接数据集并不是域存储库的好选择,而是将这些查询放入读取存储库(或更好命名的查找器)

如果您发现自己想要查询一个对象集合以执行某些域逻辑,那么它是一个指示器,您必须抽象这个集合并将其放入聚合根中以封装它们,并使业务操作或方法对它们起作用

退房(http://moh-abed.com/2011/09/13/pure-old-ddd-with-a-twist-from-cqrs/)及(http://simon-says-architecture.com/2011/08/23/repository)

据我所知,没有汽车合同是不存在的,因此汽车是不存在的 聚合根

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

聚合中的对象可以保存对其他聚合的引用 根

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

回到你的问题,我的理解是,这个领域类似于租车/卡车/豪华轿车/推土机。我认为HireContract可能不是Car集合的一部分,因为它们可能有不同的生命周期,而HireContract在没有Car的情况下仅凭其自身就有意义。这似乎更像是一种订单-产品关系,这也是两个不同聚合相互引用的经典示例。这一理论也被企业需要看到“所有合同”这一事实所证实。他们可能不认为汽车包含所有合同。如果这是真的,你就需要保留你的合同


另一方面,您可能有兴趣阅读这篇关于存储库界面设计的文章。

我确实想让人们能够锁定“汽车”进行编辑。我可以将雇佣合同视为一个整体。我需要防止人们能够添加重叠的雇佣期。如果雇佣人数是一个总数,我还可以强制执行吗?如果不了解你的领域,很难回答这个问题。但我可以给你一个提示。Udi Dahan和/或Greg Young提到了一种方法,您应该试着想象一下,在没有计算机的情况下,这种功能如何在“纸面”业务中实现。这可能会导致采用更为异步的方法(允许租用期暂时重叠,就像亚马逊允许两个客户订购图书一样,即使只有一个剩余库存,然后通过电子邮件通知您)。如果你取消“所有事情都应该始终100%一致”的限制,你可以取得很多成就。稍后可能会发布更详细的问题。我的蓝皮书应该在本周到达,所以希望我能更好地掌握DDD的良好实践。谢谢你的帮助。这些链接已经失效了,最好在答案中引用重要的部分。幸运的是,中存在旧快照,但是,这是一个很好的答案。DDD的聚合根实际上只是关于命令的执行/更改范围,。。但是,存在不同的只读视图关注点,在聚合根中进行思考是没有意义的,例如,对统计信息、报表、仪表板元素的聚合查询。。。