2013-11-26 4 views
0

Я хочу создать общую абстракцию базы данных, чтобы выставить один и тот же интерфейс, не беспокоясь о типе 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 

Я не уверен, что этот дизайн является наилучшей практикой. Как я могу реализовать дизайн, который предлагает эти функции?

+0

Это хорошее решение. Вы можете взглянуть на мой ответ на похожий вопрос: http://stackoverflow.com/questions/16712177/how-to-make-a-repository-for-class-with-t-in-ef/16712776#16712776 –

+0

Он называется шаблоном репозитория, часто шаблон репозитория используется с образцом шаблона работы. Вы можете посмотреть на этот пример: 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

ответ

0

Почему вы не используете стандартный шаблон, например, шаблон репозитория, который вы также можете объединить с UnitOfWork. Вы делаете это сложным для себя, просто проверьте это.

public interface IMyClassRepository : IDisposable 
    { 
    IQueryable<MyClass> All { get; } 
    IQueryable<MyClass> AllIncluding(params Expression<Func<MyClass, object>>[] includeProperties); 
    MyClass Find(int id); 
    void InsertOrUpdate(MyClass myClass); 
    void Delete(int id); 
    void Save(); 
    } 

    public class MyClassRepository : IMyClassRepository 
    { 
    DBContext context = new DBContext(); 
    public IQueryable<MyClass> All 
    { 
     get { return context.Employees; } 
    } 
    public IQueryable<MyClass> AllIncluding(params Expression<Func<MyClass, object>>[] includeProperties) 
    { 
     IQueryable<MyClass> query = context.MyClasses; 
     foreach (var includeProperty in includeProperties) 
     { 
     query = query.Include(includeProperty); 
     } 
     return query; 
    } 
    public MyClass Find(int id) 
    { 
     return context.MyClasses.Find(id); 
    } 
    public void InsertOrUpdate(MyClass myClass) 
    { 
     if (myClass.Id == default(int)) 
     { 
     // New entity 
     context.MyClasses.Add(myClass); 
     } 
     else 
     { 
     // Existing entity 
     context.Entry(myClass).State = EntityState.Modified; 
     } 
    } 
    public void Delete(int id) 
    { 
     var employee = context.Employees.Find(id); 
     context.Employees.Remove(employee); 
    } 
    public void Save() 
    { 
     context.SaveChanges(); 
    } 
    public void Dispose() 
    { 
     context.Dispose(); 
    } 
    } 

    public class MyClass 
    { 
    } 
Смежные вопросы