Может ли 'ViewModel' содержать свойство типа 'DomainModel'

В asp.net MVC 4 у меня есть 2 DomainModels

  1. Товар
  2. порядок

и связанный ViewModel

  1. OrderDetailsViewModel

В моем файле отображения "OrderDetailsViewModelMapper" я вручную сопоставляю эти 2 DomainModel с моей ViewModel. Файл Mapper "OrderDetailsViewModelMapper" вызовет мой метод репозитория, который будет обращаться к БД и возвращать мои 2 DomainModels, т.е.Product и Order, после сопоставления их внутри самого репозитория. Итак, mapper просто вызывает хранилище и получает его DomainModels. Я не хочу Automapper. Теперь у меня есть 2 вопроса по этому сценарию.

  1. Является ли вышеупомянутый поток для заполнения моей ViewModel нарушением каких-либо рекомендаций?
  2. Могу ли я сохранить 2 свойства типа Product & Order внутри моего "OrderDetailsViewModel", как показано ниже, и просто сопоставить только эти свойства, а не дублировать все свойства внутри "OrderDetailsViewModel" и сопоставить их по отдельности?
public class OrderDetailsViewModelMapper
{
public Product Product{ get; set; }
public Order Order{ get; set; }
}

1 ответ

Я думаю, что вы немного скучаете.

  • Во-первых, класс mapper - это статический класс, который имеет несколько статических методов для отображения объектов из одного типа в другой. И лучший способ - использовать Mapper в вашем пользовательском интерфейсе, а не в репозитории. Из того, что я вижу в вашем случае, это должно называться DTO, а не Mapper.

  • Во-вторых, для модели представления лучше всего использовать примитивные свойства, которые будут отображаться в представлении НЕ для хранения свойств навигации в модели.

Лучший способ передать ваши данные из репозитория в ViewModel (список или отдельный объект) - это использовать проекцию на IQueryable<Model> и в этом случае вам не нужно создавать DTO, вы просто проецируете на подходящую ViewModel

например

var list = repository.Query.Select(m=>new ViewModel{
                                      First = m.First.Something,
                                      Second = m.Second.SomethingElse});

Обновить:

После прочтения вашего комментария вам нужно, чтобы DTO "Объект передачи данных" был возвращен из вашего репозитория, или вы можете вернуть свою ViewModel напрямую. Это зависит от сложности вашего приложения и от того, кем вы хотите этим управлять.

Другие вопросы по тегам