首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >NerdDinner通用存储库接口?

NerdDinner通用存储库接口?
EN

Stack Overflow用户
提问于 2012-06-09 10:52:45
回答 1查看 266关注 0票数 0

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

代码语言:javascript
复制
void Add(Customer customer)

该命令的接口公开了:

代码语言:javascript
复制
void Add(Order order)

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

代码语言:javascript
复制
db.Customers.InsertOnSubmit(customer)

代码语言:javascript
复制
db.Orders.InsertOnSubmit(order)

分别使用。为了停止一遍又一遍地重复相同的代码(并尽量减少项目中的.cs文件数量),我想我可以定义一个通用的基本存储库接口,例如:

代码语言:javascript
复制
public interface IRepository<T>
{
void Add(T t)
void Delete(T t)
void Save();   // This one is truly the same in any case!
}

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

代码语言:javascript
复制
db.T.InsertOnSubmit(t)

这能办到吗?

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

谢谢

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2012-06-09 18:57:42

从你的问题

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

db.T.InsertOnSubmit(t)

这能办到吗?

我想你需要这样的东西

代码语言:javascript
复制
db.GetTable<T>().InsertOnSubmit(entity);

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

代码语言:javascript
复制
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();
    }
}
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/10960377

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档