在处理多组实体时,使用存储库模式(使用实体框架)的正确方法是什么?
我应该为每个实体创建一个存储库吗?
例如: -
拥有以下实体:文章,类别和评论
我应该为每个人都有一个存储库吗?
我正在使用这样的存储库:
public class BaseArticleRepository : BaseRepository
{
private ContentModel _contentctx;
public ContentModel Contentctx
{
get
{
if ((_contentctx == null))
{
_contentctx = new ContentModel();
}
return _contentctx;
}
set { _contentctx = value; }
}
// IDisposable Support code comes here....
}
文章的示例存储库:
public class ArticlesRepository : BaseArticleRepository
{
public Article GetArticleById(int id)
{
var article = Contentctx.Articles.Where(o => o.ArticleID == id).FirstOrDefault();
return article;
}
public List<Article> GetArticles()
{
var articles = Contentctx.Articles.ToList();
return articles;
}
public List<ArticleHeader> GetArticlesHeaders()
{
var articles = (from article in Contentctx.Articles
select new ArticleHeader
{
ArticleID = article.ArticleID,
Title = article.Title,
CategoryTitle = article.Articles_Categories.Title,
AddedBy = article.AddedBy,
AddedDate = article.AddedDate,
ViewCount = article.ViewCount
}).ToList();
return articles;
}
public List<ArticleHeader> GetArticlesHeaders(int PageIndex, int PageSize)
{
var articles = (from article in Contentctx.Articles
select new ArticleHeader
{
ArticleID = article.ArticleID,
Title = article.Title,
CategoryTitle = article.Articles_Categories.Title,
AddedBy = article.AddedBy,
AddedDate = article.AddedDate,
ViewCount = article.ViewCount
}).OrderBy(p => p.AddedDate).Skip(PageSize * PageIndex).Take(PageSize).ToList();
return articles;
}
public int GetArticleCount(string txtFilter)
{
int ret = Contentctx.Articles.Where(o => o.Title.Contains(txtFilter)).Count();
return ret;
}
public int AddArticle(Article article, int categoryId)
{
Contentctx.AddToArticles(article);
}
}
基本上每个存储库都实现所有CRUD数据(包括使用过滤器和排序获取数据),尽管我在一些博客中读到这是错误的存储库模式实现,因为存储库必须只实现基本的,通用的函数来检索和插入(删除修改) )数据 所有排序,过滤必须在内存中本地完成。
但我会在服务器端(sqlserver)进行任何操作。( 如果我只需要标题和摘要,为什么要从数据库加载所有文章(包括所有字段)?
答案 0 :(得分:2)
我建议为您正在处理的每个聚合根创建一个存储库。 aggregate root是您实际想要拥有的数据结构,即您正在操作的对象,即客户,它可能具有地址,订单,发票等作为子结构(您使用这些相关子结构检索的实际客户是聚合各种表格。)
答案 1 :(得分:0)
说“这是正确的方法”总是一个冒险的肯定,但我认为你应该创建聚合(由各种表组成的实体),一旦完成,尝试了解工作单元( UoW)模式。 UoW是我用来处理多个存储库的方式。
顺便说一句,我同意zespri。在内存中排序和过滤不是一个好主意。