Domain vs DTO vs ViewModel - 如何以及何时使用它们?

时间:2012-10-13 15:03:31

标签: asp.net-mvc entity-framework viewmodel automapper dto

在具有域层(DL)/业务(服务)层(BL)/表示层(PL)的多层项目中,将实体传递到表示层的最佳方法是什么?

DO => Domain Object;
DTO = Domain Transfer Object;
VM => View Model;
V => View;

选项1:

DL => DO => BL => DTO => PL => VM => V

这个选项似乎是最佳实践,但似乎也很重要。

选项2:

DL => DO => BL => DTO => PL => V

这个选项似乎不是很好的做法,但由于DTO与VM几乎完全相同,我们可以将它直接传递给View,并且实现和保护它的麻烦不大。

此选项对于多个布局是否也可靠,例如,对于移动设备,我可能需要来自BL的较少信息,因此我需要为此特定布局使用不同的VM?

4 个答案:

答案 0 :(得分:10)

将DTO传递给视图是可以的。如果您需要更改或增强DTO,请创建ViewModel。常见的情况是添加链接。 ViewModel也可以将DTO作为复杂属性引用。

答案 1 :(得分:1)

如果你想要有不同的视图需要来自你的Dto的不同数据,听起来你可能会从这些视图中获得不同的视图模型,并将你的Dto映射到这些视图。

这背后的一个想法是允许更大的自由来更改您的视图模型,知道它不会对您的应用程序的任何其他部分产生影响。如果您的Dto在多个视图中使用,那么对Dto的每次更改都需要您测试每个视图。

答案 2 :(得分:0)

在这里看到我的回复: https://stackoverflow.com/a/14059156/1288063

你说: 这个选项似乎是最佳实践,但似乎也很重要。

也许很重要的是,juste几行代码重复大部分时间,但肯定不会。

答案 3 :(得分:0)

对我来说,这个决定是基于我放置验证逻辑的位置。

场景#1:在viewmodel中添加数据注释(在UI层中)极大地简化了编程。大多数情况下,DTO和视图模型之间会有一对一的映射。在这种情况下,选项1是好的。 DL => DO => BL => DTO => PL => VM => V

场景#2)如果验证未附加到ViewModel,则DTO将替换为ViewModel,ViewModel将驻留在Business层中。 DL => DO => BL => VM => PL => V

在验证逻辑位于域模型中的情况下,场景#2可能是完美的。许多UI应用程序都使用这些模型。 UI只列出列表中的错误,如业务层所给出的(虽然不是非常用户友好)。随着应用程序经历业务规则更改,我们只更改域模型。同样,数据库相关的验证可以通过EF自动生成(如果使用.net),甚至更少的更改范围。