Аргумент в том, что ваши "POCO" - это модели вашего домена, и ваши View не должны относиться к моделям домена.
Подумайте об этом следующим образом - проверка данных, если вы хотите аннотации данных, выпришлось бы поместить их в свои POCO - но проверка входных данных (это поле обязательно и т. д.) на самом деле не является проблемой домена, это проблема пользовательского интерфейса - следовательно, использование ViewModels для аннотаций данных и AutoMapper.
Конечно, это не просто, это вопрос предпочтений.
Я также использую MVC / EF4 / POCO / AutoMapper / Service Layer и никогда не привязываюсь к POCO - я всегда использую ViewModel для View.
Таким образом, у вас хороший уровень согласованности:
- Все представления имеют ViewModel
- В POCO только логика бизнеса / домена
- ViewModel имеют базовую проверку ввода
- Затем они сопоставляются с POCO, которые вызывают проверку домена / бизнеса
** Редактирование - в ответ на комментарии: **
Ваши репозитории возвращают IQueryable?Если так, как вы справляетесь с контекстом?Я имею в виду, что ваши репозитории реализуют IDisposable, а затем вы распределяете их в контроллерах?
Да - мои репозитории возвращают IQueryable<T>
, где T - совокупный корень.Мои репозитории получают единицу работы (которая реализует IDisposable).Единица работы - это оболочка для контекста EF4.StructureMap (DI-контейнер) отвечает за время жизни компонентов (включая UoW - так называемый контекст).Я создаю UoW для каждого HTTP-запроса и удаляю его по окончании.Моя «Служба» вызывает методы в моем репозитории IQueryable и возвращает коллекции (например, материализует запрос перед его передачей обратно в Контроллер).
Где вы производите отображение?Вы делаете это в контроллере?
На ваше усмотрение.Лично я бы создал статический класс "начальной загрузки", который имеет один метод, например "Configure".Вызовите это один раз в вашем событии Application_Start (Global.asax).Эта техника описана здесь .
Удачи!