0

我使用 NerdDinner (MVC 2) 作为我项目的基础。虽然存储库接口设计工作得很好,但在我的实际应用程序中有十几个模型类(而 NerdDinner 只有一个,Dinner),这意味着我需要为每个类一个接口(及其实现)。此外,基本的接口方法(获取、保存、添加、删除等)是相同的,这意味着我必须在每个实现类中复制和粘贴相同的代码。唯一改变的是类的类型,例如客户的接口暴露:

void Add(Customer customer)

并且订单的界面公开:

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 是数据上下文对象(我使用的是 linq to sql 设计器)。

谢谢

4

1 回答 1

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();
    }
}
于 2012-06-09T18:57:42.890 回答