asp.net mvc viewmodels и выборка данных в классе модели

У меня вопрос об извлечении данных из модели представления.

Например, у меня есть модель просмотра:

public class EmployeeCreateVM
{
    public Employee Employee { get; set; }
    public List<EmployeeState> EmployeeStates { get; set; } // dropdownlist data
    public List<EmployeeType> EmployeeTypes { get; set; } // dropdownlist data

    public EmployeeCreateVM()
    {
        EmployeeStates = ...
        EmployeeType = ...
    }
}

Мой вопрос касается модели представления дизайна, специально для получения данных. В моем текущем проекте я получаю данные, например, от контроллера:

[Get]
EmployeeCreateVM model = new EmployeeCreateVM();
model.EmployeeStates = _repository....

[Post] - again
model.EmployeeStates = _repository....

Является ли плохой практикой извлекать данные непосредственно из класса модели представления?

Спасибо


person Mennion    schedule 11.01.2012    source источник


Ответы (1)


arrow_upward
1
arrow_downward

Да, поскольку это нарушает разделение ответственности. Если позже вам потребуется изменить методологию доступа к данным, он больше не будет находиться в одном месте (контроллере), а в каждой модели представления, использующей этот репозиторий.

Здесь есть более подробное обсуждение: Что добавить в вашу ViewModel

person Shawn    schedule 11.01.2012
comment
Спасибо за интересную ссылку. В своем приложении я использую DI, поэтому, если я изменю методологию доступа к данным, я просто напишу другую реализацию моего класса репозитория и установлю ее в di configi - person Mennion; 11.01.2012
comment
@Mennion Даже в этом случае у вас не должно быть этого в конструкторе; модель представления (как и все классы) должна делать одно. Представьте, что вы хотите вернуть только определенный EmployeeTypes своему контроллеру / представлению, для этого вам потребуется отредактировать свой EmployeeCreateVM класс, что кажется неправильным. - person wal; 11.01.2012
comment
@Wal - да, получение данных в классе vm для меня неестественно. Но мне нравится принцип DRY, и получение vm в действиях get и post - это не DRY ... - person Mennion; 11.01.2012
comment
@Mennion Что вы повторяете в действиях получения и публикации? Я предлагаю переместить дублированный код в класс EmployeeViewModelRepositoryService или аналогичный. - person wal; 11.01.2012
comment
@ Mennion Я согласен. Обычно я использую аналогичную сервисную модель, которая кэширует соответствующие данные раскрывающегося списка, поэтому, когда мне нужно повторно накачать модель просмотра в случаях, когда модель POST недействительна, мне даже не нужно обращаться к репозиторию. - person Shawn; 11.01.2012
comment
@wal Потому что, если модель недействительна в действии публикации, я возвращаю модель обратно для просмотра и снова заполняю раскрывающиеся списки ... - person Mennion; 11.01.2012