Шаблоны для использования EntityFramework? - PullRequest
6 голосов
/ 04 августа 2009

Что такое альтернативные шаблоны использования для Entity Framework?

Некоторые из тех, кого я знаю:

  1. "Обычный" EntityFramework - он же Unity of Work using (Data.Model c = new Data.Model()) { var z = c.Users.Where(x=>x.Name=='John'); }<br>

  2. Шаблон репозитория //Model implements IRepository User user = Model.Instance.Get<User>(u => u.Name == "John");

  3. Что еще?

Ответы [ 5 ]

2 голосов
/ 04 августа 2009

Хорошей книгой является книга Мартина Фаулера "Образцы архитектуры корпоративных приложений" .

Там он просматривает некоторые шаблоны для извлечения / отображения данных, такие как DTO, Единица работы, шаблон репозитория и т. Д. ... Может быть, что-то может быть полезно вместе с Entity Framework. Я должен был бы взглянуть на это.

1 голос
/ 17 апреля 2011

Я отвечаю на ваш вопрос, исходя из предположения, что вы используете Entity Framework непосредственно в своем пользовательском интерфейсе / контроллере / сервисах.

Было доказано, что использование любого ORM, включая EF, непосредственно в вашем UI / Controllers / Services вызовет много проблем в будущем. Кроме того, это затрудняет, если не невозможно, модульное тестирование вашего приложения.

Второй подход, т. Е. «Модель реализует репозиторий», на мой взгляд, также неверен, поскольку Модель и Репозитории имеют разную ответственность, и, основываясь на части «СОЛНЕЧНАЯ ОТВЕТСТВЕННОСТЬ» принципов SOLID, не следует объединять две концепции. Даже если вы хотите использовать шаблон Active Objects в своей модели, который я не рекомендую, вы должны отделить свою модель от используемой ORM.

Лучшее и наиболее рекомендуемое решение - иметь интерфейс, такой как IRepository или IRepository, с очень простыми элементами, как предлагает шаблон. что-то вроде:

Interface IRepository<T> where T:class
{
    void Insert(T entity);
    void Update(T entity);
    void Delete(T entity);

    // if you don't want to return IQueryable
    T FindById(object id);
    IEnumerable FindXXXXX(params)

    // if you prefer to return an IQueryable
    IQueryable<T> Find(Expression<Func<T, bool>> predeicate);
}

Обратите внимание, что некоторые репозитории людей не должны возвращать IQueryable. Кроме того, вы можете использовать ISpecification вместо выражений и лямбда-выражений.

вам потребуется реализовать интерфейс IRepositoy для большинства ваших объектов. Используя этот подход, вы также можете высмеивать ваши репозитории при написании модульных тестов. В производственной среде вам нужно будет использовать поставщика Ioc, такого как Unity, Ninject, Linfu, Catsle и т. Д., Вы также можете воспользоваться реализацией общего локатора служб microsoft, чтобы избежать подключения к конкретной инфраструктуре IoC.

В прежние времена у меня был интерфейс доступа к данным, который был реализован для конкретной бизнес-области или службы. Одна из проблем, связанных с этим подходом, заключается в том, что в результате вы получите дублирующий код в разных службах доступа к данным, если будете отслеживать исходный код и в конечном итоге это сделаете.

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

LINQ 2 SQL может быть альтернативой. Вот статья Внедрение зависимостей с Unity и Linq to SQL DataContexts

ЕДИНСТВО - http://unity.codeplex.com/

0 голосов
/ 04 августа 2009

Есть много статей на эту тему, но список будет значительно сокращен, если вы хотите хорошую. Эта статья из MSDN Magazine довольно хороша, хотя она специально предназначена для n-уровневых приложений. Но поскольку вы не говорите, что строите, возможно, это поможет.

0 голосов
/ 04 августа 2009

Мы используем код, аналогичный тому, который есть в вашем примере единицы работы.

Кроме того, мы делаем привязку объектов к объектам передачи данных.

...