Базовый / простой объект доступа к данным (DAO) с Entity Framework 4.0 - PullRequest
2 голосов
/ 03 августа 2010

Я пытаюсь собрать простой POC для n-уровневого приложения, использующего EF4 на уровне данных. Я просмотрел многочисленные примеры в Интернете, и, как представляется, обычной практикой является использование DAO или репозитория в качестве оболочки для ORM. Насколько я понимаю, основное различие между ними состоит в том, что репозиторий является более общим и использует IQueryable, например, для параметров. Я хотел бы (к лучшему или к худшему) на этом этапе придерживаться более простых объектов DAO, которые будут содержать довольно специфические методы, такие как GetPersonByFirstName (имя строки), подобно тому, что было сделано ранее с вещами на основе ADO.NET. Тем не менее, мне все еще нужны несколько "сквозных" функций для моих DAO.

  1. Как мне делиться контекстом между DAO? Желательно, чтобы бизнес-объект, создающий экземпляр DAO, не знал об EF. Первоначально я думал, что BO будет передавать сессию DAO, но это нарушит мое требование о независимости BO от EF (если я не думаю о чем-то). Может быть, какой-то подход Singleton / Factory?
  2. Есть ли более элегантный способ справиться с этим для приложений ASP.NET, использующих контекст запроса? В основном, настройка типа сеанса для запроса, но без необходимости изменения какого-либо кода уровня представления.
  3. Полагаю, у меня может быть базовый класс DAO с очень базовыми методами CRUD, которые будут совместно использоваться всеми DAO, но опять же не до такой степени, как IQueryable.
  4. Я хотел бы использовать TransactionScope в моем бизнес-объекте для обертывания моего DAO (я не вижу в этом проблемы).

Спасибо!

1 Ответ

0 голосов
/ 05 августа 2010

После дальнейших исследований кажется, что я на правильном пути сохранения контекста Entity Framework в httpContext.Items. Существует множество решений, которые в основном создают фабрику, которая таким образом управляет временем существования контекста EF. Моя основная проблема с этим решением состоит в том, что мои библиотеки не будут работать не-веб-проекты, поэтому я думаю, что мне нужно пойти по пути использования контейнера IoC (вместо фабрики), чтобы добавить контекст для меня со временем жизни объектно-за запрос. Таким образом, если мне нужно использовать мои библиотеки в консольном приложении, например, я мог бы изменить конфигурацию на что-то вроде объекта для потока и т. Д.

...