Шаблоны для использования EntityFramework?
-
22-07-2019 - |
Вопрос
Что такое альтернативные шаблоны использования для Entity Framework?
Некоторые из тех, кого я знаю, это:
<Ол> <Литий> <р> & Quot; Обычная & Quot; EntityFramework - он же Unity of Work <Код> код>using (Data.Model c = new Data.Model())
{
var z = c.Users.Where(x=>x.Name=='John');
}
Шаблон репозитория <Код> код>
//Model implements IRepository
User user = Model.Instance.Get<User>(u => u.Name == "John");
Решение
Хорошей книгой является книга Мартина Фаулера " Шаблоны архитектуры корпоративных приложений ".
Там он проходит через несколько шаблонов для извлечения / отображения данных, таких как DTO, Единица работы, шаблон репозитория и т. д. Возможно, что-то может быть полезно вместе с Entity Framework. Я должен был бы взглянуть на это.
Другие советы
Я отвечаю на ваш вопрос, исходя из предположения, что вы используете Entity Framework непосредственно в своем пользовательском интерфейсе / контроллере / сервисах.
Было доказано, что использование любого ORM, включая EF, непосредственно в вашем пользовательском интерфейсе / контроллерах / сервисах вызовет много проблем в будущем. Кроме того, это делает его очень трудным, если не невозможным, модульным тестированием вашего приложения.
Второй подход, т. е. «Модель реализует репозиторий». на мой взгляд, это также неправильно, поскольку модель и репозитарии имеют разную ответственность и основаны на «единой ответственности»; часть твердых принципов, вы не должны объединять две концепции вместе. Даже если вы хотите использовать шаблон 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.
В прежние времена у меня был интерфейс доступа к данным, который был реализован для конкретной бизнес-области или службы. Одна из проблем этого подхода заключается в том, что в результате вы получите дублирующий код в разных службах доступа к данным, если будете отслеживать исходный код и в конечном итоге это сделаете.
Мы используем код, аналогичный тому, который есть в вашем примере с единицей работы.
Кроме того, мы делаем привязку объектов к объектам передачи данных.
Есть много статей на эту тему, но список будет значительно сокращен, если вы хотите хорошую. Эта статья из журнала MSDN довольно хорошо, хотя он имеет дело с n-уровневыми приложениями. Но так как вы не говорите, что строите, возможно, это поможет.
LINQ 2 SQL может быть альтернативой. Вот статья Внедрение зависимостей с Unity и Linq to SQL DataContexts р>
UNITY - http://unity.codeplex.com/