我正在尝试通过使用可以子类化的通用存储库来简化现有的存储库。问题是我不知道如何编写一些基类方法。我目前有:
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()
and 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 属性)。
如何制作一个可以协调为更具体版本的抽象基本方法?
你可以有一个通用的表达 http://msdn.microsoft.com/en-us/library/bb397951.aspx参数为你的GetSingle
method:
public interface IRepository<T> : IDisposable where T : class
{
....
T GetSingle(Expression<Func<T, bool>> filter);
void Save(T entity);
}
and in 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
{
...
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)