我使用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设计器)。
由于
答案 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();
}
}