В частности, nHibernate (3.0+) и EF поддерживают LINQ, поэтому вы создаете простой интерфейс IRepository, который принимает Expression<Func<TItemType,bool>>
, и избегаете использования репозиториев, имеющих GetPersonByID, getPersonByName и т. Д. Хотя это может помешать вам обменять ORM Iподумайте, что вы не будете использовать ORM, который не поддерживает LINQ.
Этот интерфейс может выглядеть примерно так (это НЕ полная реализация! Это просто демонстрация, и реальный интерфейс нуждается в лучшей доработке! Это просто то, что я сейчас смоделировал! Возможно, потребуется также реализовать IDisposable и т. Д.):
interface IRepository<TPersistant>
{
void Save(TPersistant item);
void Delete(TPersistant item);
TPersistant Find(Expression<Func<TPersistant,bool>> predicate);
// maybe findOne or findMany
// maybe something like this
IQueryable<TPersistant> Query();
/* Other stuff like updating, transactions, commiting, etc.*/
}
Я бы,однако, хотел бы упомянуть некоторые вещи, которые люди игнорируют при абстрагировании DAL. Это моё мнение - все мое мнение .
Хотя абстракция может помочь вам «поменять» DAL в будущем, я бы сильно подумал, если вы что-то сделаете, кроме создания программного обеспечения, котороеруководствуется «лучшими практиками» и тем, «что люди говорят, что вы должны делать», а с другой стороны, стреляя себе в ногу.
Когда вы полностью абстрагируете DAL, вы можете потерять другие специфические функции ORM, которые фактически делают егоORM лучше других или даже будущих оптимизаций производительности ради абстракций.i / e Будущие запросы в nHibernate (которые являются огромной функцией), которые вы в основном теряете, если абстрагируете их.Вы также можете потерять ленивую оптимизацию инициализации (выберите проблемы N + 1), поскольку вы не можете использовать Fetch (nHibernate) или Include (EF).Даже такие мелочи, как поддержка enum (я считаю, что EF STILL не поддерживает).
Я также хотел бы добавить, что многие разработчики создают абстракции ради будущих изменений, хотя в действительности эти изменения почтиникогда не случится.
Так что пока я не говорю, не абстрагируйся от DAL, потому что есть много преимуществ, таких как модульное тестирование, развязка и т. д. (хотя вы всегда можете создать репозиторий «связанный с dal», который помог бы с модульным тестированием), это то, что должно (), если стоит заплатить цену некоторых функций, которые фактически делают nhibernate / EFлучше, чем другие.