Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ionic-framework/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Architecture 理解DTO和贫血区域模型_Architecture_Domain Driven Design_N Tier Architecture - Fatal编程技术网

Architecture 理解DTO和贫血区域模型

Architecture 理解DTO和贫血区域模型,architecture,domain-driven-design,n-tier-architecture,Architecture,Domain Driven Design,N Tier Architecture,我对域模式还不熟悉,我需要确保我了解到目前为止读到的内容请告诉我以下句子是否正确,是否违反了与DDD相关的原则 0)DAL将接收DTO中的参数,并返回DTO(实体)列表中获取的数据 1) 通过存储库模式取消BLL和DAL的耦合 2) 实体是DTO对象 3) ProductCategoryData包含ProductData的列表 4) 如果BLL.ProductCategory不包含描述业务对象的属性,则域模型反模式将是无效的 5) BLL.ProductCategory包含一个BLL.Prod

我对域模式还不熟悉,我需要确保我了解到目前为止读到的内容请告诉我以下句子是否正确,是否违反了与DDD相关的原则

0)DAL将接收DTO中的参数,并返回DTO(实体)列表中获取的数据

1) 通过存储库模式取消BLL和DAL的耦合

2) 实体是DTO对象

3) ProductCategoryData包含ProductData的列表

4) 如果BLL.ProductCategory不包含描述业务对象的属性,则域模型反模式将是无效的

5) BLL.ProductCategory包含一个BLL.Product的列表……对此我有不好的感觉

6) 我在那个设计中避免贫血领域模型的反模式

7) 我成功地应用了域模型模式

8) 我使用DTO对象在层之间传输数据


请告诉我:)

你为什么有不好的感觉?贫血听起来是个坏词,但你发现了什么危害

我认为没有任何行为的物体是贫血的。我不会根据数据成员来判断

如果您出于其他原因选择将该行为转移到其他地方(例如服务),那么有一种观点认为您选择的架构比面向对象的架构更具功能性。真的那么糟糕吗

我认为像贫血这样的标签听起来很糟糕,但它们实际上只是描述了一个人的设计决策。这也可能揭示出某人的OOP偏见。函数式语言会被OOP实践者认为是贫乏的,但它不一定是致命的


一个更好的问题是:“我有并行模型吗?一个用于DTO,另一个用于业务层?”如果有,我会说双重维护比贫血更有害。

如果这是接口,并且对象上没有方法,那么这仍然是一个贫血模型

存储库应该与模型的聚合相关联。 我认为,你的模型只包含这些实体,而不管设计的好坏 因为总体复杂度将很低

还要为您的模型选择更好的名称,并避免使用诸如“数据”之类的通用名称。
读者立刻问:什么样的数据

“如果这是接口,并且您的对象上没有方法,那么这仍然是一个贫血模型。”但我在BLL.ProductCategory中使用了ListProductCategory??这是一个访问器,而不是一个行为,因此,如果我添加SUSubscribe方法,它将不会贫血。但是,如果系统中的某些对象不具有其自然属性的行为,该怎么办。我很困惑?实体至少会有一些行为。如果他们真的没有任何行为,那么它们就是价值对象。我看到一个系统,它有一个通过UIBLL静态类传递的DTOS,现在考虑一个DTO。学生有一个DTO类。然后在某个时候,需求改变了,学生可以参加几个课程。然后我将在所有层中更改代码,以便将Student.Class转换为Student.Class,或者更糟糕的是,将学生放在课堂上。