Я хочу создать общую абстракцию базы данных, чтобы выставить один и тот же интерфейс, не беспокоясь о типе DbContext
, который управляет база данных.Класс абстракции базы данных C# с Entity Framework
Здесь есть пример для того, чтобы хорошо объяснить концепцию:
public interface IDatabase<T> where T : DbContext {
void Add<T>(T entity);
void Remove<T>(T entity);
void SaveChanges();
}
Реализация может быть:
public MyDatabase<T> : IDatabase<T> where T : MyContext {
public T Context { get; private set; }
//singleton contructor ...
public void Add<TC>(TC entity) {
Context.Set<TC>().Add(entity);
}
public void Remove<TC>(TC entity) {
Context.Set<TC>().Add(entity);
}
public void SaveChanges {
Context.SaveChanges();
}
}
Цель этого проекта различна: разоблачить тот же интерфейс для того, отделить логику от базы данных, быстро изменить базу данных (контекст), создать один раз контекст и повторное использование в течение всего срока службы приложения (требуется механизм блокировки).
Проблема в том, что интерфейс скрывает все типы наборов в контексте.
Context.Set<TC>().Add(entity); //this line don't compile
Я не уверен, что этот дизайн является наилучшей практикой. Как я могу реализовать дизайн, который предлагает эти функции?
Это хорошее решение. Вы можете взглянуть на мой ответ на похожий вопрос: http://stackoverflow.com/questions/16712177/how-to-make-a-repository-for-class-with-t-in-ef/16712776#16712776 –
Он называется шаблоном репозитория, часто шаблон репозитория используется с образцом шаблона работы. Вы можете посмотреть на этот пример: http://www.asp.net/mvc/tutorials/getting-started-with-ef-5-using-mvc-4/implementing-the-repository-and-unit-of-work -patterns-в-ан-Asp-нетто-MVC-приложений – Cloud9999Strife