NerdDinner通用存储库接口?

时间:2012-06-09 10:52:45

标签: generics interface repository base nerddinner

我使用NerdDinner(MVC 2)作为我项目的基础。虽然存储库界面设计运行良好,但在我的实际应用程序中有十几个模型类(而NerdDinner只有一个,Dinner),这意味着我需要为每个类提供一个接口(及其实现)。另外,基本的界面方法(获取,保存,添加,删除等)是相同的,这意味着我必须复制&在每个实现类中粘贴相同的代码。唯一改变的是类的类型,例如Customer的接口公开:

void Add(Customer customer)

并且Order的界面公开:

void Add(Order order)

两种方法的实现基本相同,但当然使用适当的模型类型:

db.Customers.InsertOnSubmit(customer)

db.Orders.InsertOnSubmit(order)

分别。要一次又一次地停止重复相同的代码(并最小化项目中.cs文件的数量),我想我可以定义一个通用的基本存储库接口,例如:

public interface IRepository<T>
{
void Add(T t)
void Delete(T t)
void Save();   // This one is truly the same in any case!
}

但是如何将泛型类型应用于实现代码?我需要这样的东西:

db.T.InsertOnSubmit(t)

可以这样做吗?

PS:db是datacontext对象(我使用linq到sql设计器)。

由于

1 个答案:

答案 0 :(得分:1)

从你的问题

  

但是如何将泛型类型应用于实现代码?我需要这样的东西:
  db.T.InsertOnSubmit(t)的
  可以这样做吗?

我假设你需要这样的东西

db.GetTable<T>().InsertOnSubmit(entity);

一个简单的存储库实现,可以为您提供一个想法:

public class Repository<T> : IRepository<T> where T : class
{
    private NorthwindDataContext db = new NorthwindDataContext();

    public Table<T> Data
    {
        get
        {
            return db.GetTable<T>();
        }
    }

    public void Add(T entity)
    {
        db.GetTable<T>().InsertOnSubmit(entity);
    }

    public void Delete(T entity)
    {
        db.GetTable<T>().DeleteOnSubmit(entity);
    }

    public void Save()
    {
        db.SubmitChanges();
    }
}