Я пытаюсь реализовать шаблон минимального общего репозитория в своем приложении. У меня есть очень маленький интерфейс для запросов и сохранения данных:Реализация минимального репозитория с использованием Entity Framework
public interface IRepository
{
IQueryable<TEntity> Query<TEntity>()
where TEntity: BaseEntity;
void Save<TEntity>(TEntity entity)
where TEntity : BaseEntity;
}
BaseEntity
является базовым классом для всех объектов, я буду хранить в моем хранилище:
public abstract class BaseEntity
{
public Guid Id { get; set; }
public DateTime CreatedDate { get; set; }
public DateTime UpdatedDate { get; set; }
}
Я пытался найти рабочую реализацию такого простого репозитория с использованием Entity Framework, но было удивительно сложно найти (люди используют UnitOfWork
и другие вещи, которые делают реализацию более сложной, чем я хочу).
Так что я создал абсолютно минимальную реализацию я мог придумать:
public class EfRepository : DbContext, IRepository
{
public IQueryable<TEntity> Query<TEntity>() where TEntity : BaseEntity
{
return this.Set<TEntity>();
}
public void Save<TEntity>(TEntity entity) where TEntity : BaseEntity
{
if (entity.Id == default(Guid))
{
entity.Id = Guid.NewGuid();
this.Set<TEntity>().Add(entity);
}
else
{
this.Entry(entity).State = EntityState.Modified;
}
this.SaveChanges();
}
public DbSet<User> Users { get; set; } // User is a subclass of BaseEntity
//Other DbSet's...
}
Теперь мой вопрос, если такая реализация является правильным. Я спрашиваю, потому что я новичок в Entity Framework, и я беспокоюсь о возможных проблемах с производительностью или о вещах, которые могут ошибиться при использовании такого репозитория.
Примечание: Я пытаюсь сделать все это по 2 причинам:
- Для целей тестирования, так что я могу создать макет репозитория в моих модульных тестах проектов
- Вполне возможно, что я В будущем мне придется переключиться на другую ORM, и я бы хотел сделать этот переход максимально простым.
Возможно, стоит рассмотреть вопрос о том, является ли EF правильным ORM для использования, если вы после легкого касания и имеете проблемы с производительностью.Из личного опыта я не нашел EF очень эффективным в любом из проектов, в которых я его использовал, и он немного неуклюже, сохраняя его сопоставления в соответствии с БД или Кодом (в зависимости от того, какой путь вы выбираете, код или DB сначала). Любой, кто знает, кто работает в условиях высокой пропускной способности, физически вздрагивает всякий раз, когда кто-либо упоминает EF. –
Вопрос в том, что: EF * уже * реализует репозиторий ('DbSet') и шаблоны единицы работы ('DbContext') - зачем изобретать колесо с еще одним слоем поверх этого? –
@marc_s, у меня есть 2 причины :) Пожалуйста, см. Мое редактирование –