DDD中的哪个层是声明为Aggregates根的类?

时间:2015-04-11 17:20:09

标签: c# entity-framework domain-driven-design ddd-repositories aggregateroot

我们有一个大型应用程序,我们正在开始使用DDD开发。 我们理解聚合(根)和有界上下文和存储库的概念,其中存储库只接受要保留的聚合根。

我不清楚这是什么。我们为持久层中的每个有界上下文都有自动生成的实体类,并且在域层中有一些域模型。我们这样做是为了简化一个非常复杂的数据库结构(700多个表),这就是为什么,例如,我们有一个Customer实体类和相关实体,它们映射到CustomerModel复杂类型作为域模型。

IRepository<IAggregateRoot>有获取,保存,删除,更新CRUD方法。

鉴于上面的例子CustomerCustomerModel,dbo.Customer表有大约15个属于同一个aggreagte的其他表。但实际上应该用什么类来实现IAggreagteRoot

aggreagte是一个逻辑分组,但它是在域中完成的:

public class CustomerModel : IAggreagteRoot {}

还是在实体类中完成:

public class Customer : IAggreagteRoot {}

对我而言,将域模型类定义为aggreagtes更有意义,因为那些应用程序可以看到这些类#34;坐着&#34;在域名之上。实体是坚持不懈的。

谢谢。

2 个答案:

答案 0 :(得分:1)

我认为你在这里混合了两个概念。域层中的所有内容都是您的模型(域模型):聚合,实体,值对象等。

您将CustomerModel命名为可能只是一个数据库模型(如果我理解正确的话),并且数据库模型是基础架构级别的一部分。域层不知道这一点。

回答您的问题:客户应实施AggregateRoot界面。

示例:

infrastructure.ui.show_the_oldest_user:

oldest_user_dto = user_service.get_the_oldest_user()

oldest_user_dto只是一个原始数据

application.service.get_the_oldest_user:

user = user_repository.get_oldest()
return user

user是聚合根

infrastructure.persistence.repository.user.get_oldest:

orm_user = user_orm_model.order('age').desc().one()
user = this.reconstitute(orm_user)
return user

orm_user是来自DB的用户模型的实例,我们必须将其映射到我们的聚合根(重构)。

这样我们就没有orm实例跨越所有层,这是一个非常糟糕的耦合。当我从应用程序服务返回时,我也将聚合映射到dto,因此UI不与域模型耦合,但它不是必须的。

答案 1 :(得分:0)

AggregateRoots是实体,不同之处在于可以从服务,视图等访问它们。

在您的示例中,客户是聚合根。

CustomerAddress不是 - 因此您需要确保更新客户地址的电话通过客户

customer.UpdateAddress(addressValueObject);

而不是以任何方式处理客户背景之外的客户地址。换句话说,你不应该有像

这样的东西
address.Update(newValue)

在客户实体之外。