Читал некоторые статьи о преимуществах создания универсальных репозиториев для нового приложения ( пример ). Идея кажется хорошей, потому что она позволяет мне использовать один и тот же репозиторий для одновременного выполнения нескольких операций с несколькими различными типами сущностей:
IRepository repo = new EfRepository(); // Would normally pass through IOC into constructor
var c1 = new Country() { Name = "United States", CountryCode = "US" };
var c2 = new Country() { Name = "Canada", CountryCode = "CA" };
var c3 = new Country() { Name = "Mexico", CountryCode = "MX" };
var p1 = new Province() { Country = c1, Name = "Alabama", Abbreviation = "AL" };
var p2 = new Province() { Country = c1, Name = "Alaska", Abbreviation = "AK" };
var p3 = new Province() { Country = c2, Name = "Alberta", Abbreviation = "AB" };
repo.Add<Country>(c1);
repo.Add<Country>(c2);
repo.Add<Country>(c3);
repo.Add<Province>(p1);
repo.Add<Province>(p2);
repo.Add<Province>(p3);
repo.Save();
Однако остальная часть реализации репозитория сильно зависит от Linq:
IQueryable<T> Query();
IList<T> Find(Expression<Func<T,bool>> predicate);
T Get(Expression<Func<T,bool>> predicate);
T First(Expression<Func<T,bool>> predicate);
//... and so on
Этот шаблон хранилища работал отлично для Entity Framework и в значительной степени предлагал отображение 1: 1 методов, доступных в DbContext / DbSet. Но учитывая медленное освоение Linq другими технологиями доступа к данным за пределами Entity Framework, какое преимущество это дает по сравнению с работой непосредственно с DbContext?
Я попытался написать PetaPoco версию Repository, но PetaPoco не поддерживает Linq выражений, что позволяет создавать общий IRepository интерфейс довольно много бесполезной , если вы только не использовать его для основного GETALL, GetByID, добавление, обновление, удаление и Сохранить методы и использовать его в качестве базового класса. Затем вам нужно создать специальные репозитории со специализированными методами для обработки всех предложений «где», которые я мог бы предварительно передать в качестве предиката.
Является ли шаблон универсального репозитория полезным для чего-либо за пределами Entity Framework? Если нет, то зачем кому-то вообще его использовать вместо того, чтобы работать напрямую с Entity Framework?
Исходная ссылка не отражает шаблон, который я использовал в моем примере кода. Вот ( обновленная ссылка ).