2013-12-26 4 views
0

Недавно я просмотрел приложение, которое использует шаблон представления представления модели на уровне пользовательского интерфейса. Есть модели классов, как это:Несколько объектов передачи данных для нескольких слоев

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 

Обратите внимание, что порядок и OrderModel идентичны. Существует класс называется Model.vb в слое UI, который имеет много кода, как это:

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

Это хорошая практика, чтобы иметь два различных объектов передачи данных для каждого объекта в базе данных? то есть один DTO в пользовательском интерфейсе (OrderModel) и один в модели (заказ) или лучше иметь один DTO для каждого объекта для обоих слоев, исключающий необходимость иметь код Mapper?

ответ

0

Для правильного решения вы должны сравнить обязанности моделей на уровне пользовательского интерфейса и на уровне домена.

Хорошая практика имеет два разных объекта передачи данных для каждого объекта в базе данных? то есть один DTO в пользовательском интерфейсе (OrderModel) и один в модели (Order) ...

Это довольно распространенный подход, когда люди практикуют Domain-Driven Design. У них есть модель домена, которая ничего не знает о представлении (например, Order) и View Models (например, OrderModel), которые размещаются на уровне презентации.

... или лучше иметь один DTO на объект для обоих слоев, исключающий необходимость иметь код Mapper?

Если ваше приложение достаточно просто, и ваш Order просто DTO, что только контейнер данных и не имеет никакого поведения, вы можете иметь только один слой с DTOS.

Edit: Существует цитата из 12 ASP.NET MVC Best Practices статьи о работе с DomainModel и ViewModels.

оборудование модели Best Practices

7 -! DomainModel = ViewModel

DomainModel представляет собой область, в то время как ViewModel строится вокруг потребностей View, и эти два мира может быть (и, как правило, разные. Кроме того, DomainModel является поведением плюс поведение, является иерархическим и состоит из сложных типов, в то время как ViewModel - это только DTO, плоский и выполнен из строк. Чтобы удалить утомительный и подверженный ошибкам код сопоставления объектов, вы можете использовать AutoMapper. Для хорошего обзора различных вариантов я рекомендую вам прочитать: ASP.NET MVC View Model Patterns.

Смежные вопросы