在具有域层(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?
答案 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),甚至更少的更改范围。