c#-4.0 - EF4 : how to use a generic repository pattern ?

标签 c#-4.0 asp.net-mvc-2 entity-framework-4 repository-pattern

我正在尝试使用可以从中子类化的通用存储库来简化现有的存储库。问题是我不知道如何编写一些基类方法。我目前有:

public interface IRepository<T> : IDisposable where T : class
{
    IQueryable<T> GetAll();
    T GetSingle(int id);
    T GetSingle(string slug);
    void Save(T entity);
}

public class HGRepository<T> : IRepository<T> where T : class
{
    protected HGEntities _siteDB;
    protected IObjectSet<T> _objectSet;

    public HGRepository(HGEntities context)
    {
        _siteDB = context;
        _objectSet = _siteDB.CreateObjectSet<T>();
    }

    public IQueryable<T> GetAll()
    {
        return _objectSet;
    }

    public T GetSingle(int id)
    {
        return null;
    }

    public T GetSingle(string slug)
    {
        return null;
    }

    public void Save(T entity)
    {
        // code to save entity
    }

    public void Dispose()
    {
        _siteDB = null;
    }
}

我的困惑在于我的 GetSingle()Save() 方法。他们需要依赖于每种类型的 T 略有不同的信息。我的非通用存储库的示例:

public Article GetArticle(int id)
{
    return _siteDB.Articles.SingleOrDefault(a => a.ArticleID == id);
}

public Article GetArticle(string slug)
{
    return _siteDB.Articles.SingleOrDefault(a => a.Slug == slug);
}

public void SaveArticle(Article article)
{
    if (article.ArticleID > 0)
    {
        _siteDB.ObjectStateManager.ChangeObjectState(article, System.Data.EntityState.Modified);
    }
    else
    {
        _siteDB.Articles.AddObject(article);
    }

    _siteDB.SaveChanges();
}

如您所见,文章有自己的特定 ID。对于我的其他实体也是如此(例如,新闻项目有一个 NewsID 属性)。

如何制作一个可以协调为更具体版本的抽象基本方法?

最佳答案

您可以拥有通用的 expression您的 GetSingle 的参数方法:

public interface IRepository<T> : IDisposable where T : class
{
    ....
    T GetSingle(Expression<Func<T, bool>> filter);
    void Save(T entity);
}

以及HGRepository<T> :

public T GetSingle(Expression<Func<T, bool>> filter)
{
        return _objectSet.Where(filter).SingleOrDefault();
}

和用法:

IRepository<Article> rep = new HGRepository<Article>();
return rep.GetSingle(p => p.Slug == slug);

如果您有通用接口(interface)/存储库类未涵盖的特定场景,您可以创建从通用接口(interface)/类继承的新接口(interface)/类:

public interface IArticleRepository : IRepository<Article>
{
   ...
}

public class ArticleRepository : HGRepository<Article>, IArticleRepository
{
   ...
}

关于c#-4.0 - EF4 : how to use a generic repository pattern ?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11149272/

相关文章:

design-patterns - 什么是 System.Lazy<T> 和单例设计模式

asp.net-mvc - 为什么使用此正则表达式时 ASP.NET-MVC 路由的 UrlParameter.Optional 被忽略?

c# - 使用 jQuery 将空值发布到 MVC 操作

c# - 枚举关联时如何改善糟糕的 EF4 性能?

c# - Entity Framework 4 和查询结果的缓存

c# - 为什么协变和逆变不支持值类型

c# - 与 Access 数据库的连接池

.net - Entity Framework 4 Single() vs First() vs FirstOrDefault()

c#-4.0 - 如何使用 C# 以编程方式将所有单元格的 Excel 边框设置为外部

jquery - iframe 对于我的 MVC Web 应用程序场景是好是坏