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)


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

Здесь есть более подробное обсуждение: Что добавить в вашу 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