Entity Framework 4 POCO и AutoMapper - PullRequest
       15

Entity Framework 4 POCO и AutoMapper

4 голосов
/ 24 февраля 2011

Я работал над новым приложением MVC, которое использует EF4, доменные объекты POCO и сервисный уровень репозитория <->.

Я вижу много разговоров об использовании AutoMapper для сопоставления классов EF4 с DTO для моделей просмотра. У меня сложилось впечатление, что это должно было избавиться от тесно связанных классов EF4. Итак, мой вопрос: поскольку я использую классы POCO, я не могу просто использовать их в моделях представления? Или все еще нужен AutoMapper?

1 Ответ

13 голосов
/ 24 февраля 2011

Аргумент в том, что ваши "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).Эта техника описана здесь .

Удачи!

...