【问题标题】:NerdDinner generic repository interfaces?NerdDinner 通用存储库接口?
【发布时间】:2012-06-09 10:52:45
【问题描述】:

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

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

谢谢

【问题讨论】:

    标签: generics interface repository base nerddinner


    【解决方案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();
        }
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-11-16
      • 2017-07-16
      • 1970-01-01
      • 1970-01-01
      • 2013-10-04
      相关资源
      最近更新 更多