使用多个存储库的正确方法是什么?
本文关键字:方法 是什么 存储 | 更新日期: 2023-09-27 18:08:35
在处理多组实体时,使用存储库模式(带有实体框架)的正确方法是什么?
我应该为每个实体创建一个存储库吗?
例如:
有以下实体:文章、分类和评论。
我应该为每一个存储库吗?
我是这样使用仓库的:
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)。
为什么我应该从数据库加载所有的文章(与所有字段),如果我只需要标题和摘要?
我建议为您正在处理的每个聚合根创建一个存储库。聚合根是您实际想要作为您正在操作的对象的数据结构,例如,Customer,它可能具有Address, Orders, invoice等作为子结构(您使用这些相关子结构检索的实际客户是各种表的聚合)。
说"这是正确的方法"总是一个有风险的断言,但我认为您应该创建聚合(由各种表组成的实体),一旦完成,尝试学习工作单元(UoW)模式。UoW是我用来处理多个存储库的方法。
顺便说一句,我同意zespri。在内存中排序和筛选不是一个好主意。