我正在尝试通过使用一个可以从中继承的通用仓库来简化我的现有仓库。问题是我不知道如何编写一些基类方法。目前我的代码如下:
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属性)。
我如何创建一个抽象基本方法,可以被调和成更具体的版本?