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

В asp.net MVC 4 у меня есть 2 модели домена.

  1. Продукт
  2. Заказ

и связанная ViewModel

  1. ЗаказПодробностиViewModel

В моем файле сопоставления «OrderDetailsViewModelMapper» я вручную сопоставляю эти 2 модели домена с моей моделью представления. Файл сопоставления «OrderDetailsViewModelMapper» вызовет метод моего репозитория, который получит доступ к БД и вернет обратно мои 2 модели домена, то есть продукт и заказ, после их сопоставления внутри самого репозитория. Таким образом, картограф просто вызывает репозиторий и получает его DomainModels. Я не хочу Automapper. Теперь у меня есть 2 вопроса по этому сценарию.

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

person Jaish Mathews    schedule 05.05.2013    source источник
comment
Я думаю, что это правильный и лучший способ иметь вложенные типы. Я делаю то же самое. Было бы интересно посмотреть, не будет ли кто-нибудь противоречить этому.   -  person HaBo    schedule 06.05.2013


Ответы (1)


Я думаю, ты немного промахнулся.

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

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

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

например,

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

Обновление:

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

person Wahid Bitar    schedule 05.05.2013
comment
Конечно. Потому что я не использую структуру сущности. Мой репозиторий вызывает БД с помощью ADO.NET. Итак, как можно реализовать IQueryable‹Model› для операций CRUD? - person Jaish Mathews; 08.05.2013