3

我想通过使用我可以从中继承的通用回购简化我现有的回购。问题是我无法弄清楚如何编写一些我的基类方法。我目前有:EF4:如何使用通用存储库模式?

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属性)。

我该如何制作一个抽象的基础方法,可以将其调整为更具体的版本?

+1

第一个问题应该是[_why_使用存储库(http://stackoverflow.com/a/5488947/861716)。 –

+0

伟大的链接。也就是说,我的项目非常简单,我的后端实际上只是简单的CRUD功能。它没有DDD。 –

+1

更多的理由戒掉沙袋密码,不是吗? –

回答

3

你可以有一个通用的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); 

如果你有特殊的情况,其通用接口/存储库类不包括,您可以创建新的接口/类从一般的人继承:

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

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