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 
{ 
    ... 
}