多个层的多个数据传输对象

时间:2013-12-26 11:54:09

标签: vb.net design-patterns

我最近查看了一个应用程序,该应用程序使用用户界面层中的模型视图展示器模式。有像这样的模型类:

Public Class OrderModel
        Public Property OrderId() As Integer
        Public Property OrderDate() As Date
        Public Property RequiredDate() As Date
        Public Property Freight() As Single    
        Public Property OrderDetails() As IList(Of OrderDetailModel)
        Public Property Member() As MemberModel
    End Class

在域层中,有这样的域类:

Public Class Order
        Inherits BusinessObject
        Public Property OrderId() As Integer
        Public Property OrderDate() As Date
        Public Property RequiredDate() As Date
        Public Property Freight() As Double
        Public Property Member() As Member
        Public Property OrderDetails() As List(Of OrderDetail)
    End Class

请注意,Order和OrderModel是相同的。 UI层中有一个名为Model.vb的类,其中包含许多代码:

Return Mapper.Map(Of List(Of Member), List(Of MemberModel))(members)

为数据库中的每个实体提供两个不同的数据传输对象是一种好习惯吗?即用户界面中的一个DTO(OrderModel)和模型中的一个DTO(订单),或者两个层的每个实体都有一个DTO,而不需要使用Mapper代码?

1 个答案:

答案 0 :(得分:0)

为了做出正确的决定,您应该比较用户界面层和域层中模型的职责。

  

为数据库中的每个实体提供两个不同的数据传输对象是一种好习惯吗?即用户界面中的一个DTO(OrderModel)和模型中的一个(订单)...

当人们练习Domain-Driven Design时,这是很常见的方法。他们的域模型对放置在表示层中的表示(例如Order)和View Models(例如OrderModel)一无所知。

  

...或者两个图层的每个实体都有一个DTO,而不需要使用Mapper代码?

如果您的应用程序足够简单且您的Order只是DTO,它只是数据容器并且没有行为,那么您可能只有一个带有DTO的图层。

修改 12 ASP.NET MVC Best Practices文章引用了有关使用DomainModel和ViewModels的文章。

  

模型的最佳实践

     

7 - DomainModel!= ViewModel

     

DomainModel代表域,而ViewModel是围绕View的需求而设计的,这两个世界可能(通常是)不同。此外,DomainModel是数据加行为,是分层的,由复杂类型组成,而ViewModel只是一个DTO,扁平,由字符串组成。要删除繁琐且容易出错的对象映射代码,可以使用AutoMapper。有关各种选项的概述,我建议您阅读:ASP.NET MVC View Model Patterns