UnitOfWork 和 Repository 模式概念问题和最佳实践

问题描述 投票:0回答:1

我在

Card
实体上编写了一个存储库:

public class CardRepository : Repository, ICardRepository 
{
    public CardRepository(EntityContext context) : base(context) 
    {
    }

    public async Task AddCardAsync(Card card,CancellationToken cancellationToken=default) 
        => await _context.Cards.AddAsync(card,cancellationToken);


    public IQueryable<Card> GetCardQuery(bool asNoTracking = true)
        => asNoTracking ? _context.Set<Card>().AsNoTracking() : _context.Set<Card>();

    public async Task<Card?> GetCardAsync(CancellationToken cancellationToken = default,
                     bool asNoTracking = true,
                     Expression<Func<Card, bool>>? predicate = null,
                     ICollection<KeyValuePair<SortType,Expression<Func<Card,object>>>> orders = null,
                     ICollection<Expression<Func<Card,object>>> includes = null) 
    {
        var query = _context.Set<Card>().AsQueryable();

        if (asNoTracking) 
            query = query.AsNoTracking();

        if (predicate != null) 
            query = query.Where(predicate);

        if (orders != null && orders.Any()) 
            foreach (var order in orders)
                query = order.Key == SortType.AES ? query.OrderBy(order.Value) : query.OrderByDescending(order.Value);
    
        if (includes != null && includes.Any())
            foreach (var include in includes)
                query = query.Include(include);
    
        return await query.FirstOrDefaultAsync(cancellationToken);
    }
}

我对存储库模式有一些疑问

  1. 我有一个返回

    IQueryable<Card>
    的方法,存储库应该返回
    IQueryable
    吗?我如何知道其他开发者正在使用
    AddCardAsync
    方法而不是使用
    GetCardQuery
    并添加
    Card
    进行查询?

  2. 如果我删除

    GetCardQuery
    并写入
    GetCardAsync
    需要获取一些参数:在这种方法中,我的问题是
    includes
    ,因为此参数可以包含相关实体的一级。我可以获取 n 级包含的
    Include
    ThenInclude
    的字符串(实体名称)列表,但我想通过
    Expression<Func<Card,object>>
    获取 n 级包含,我该怎么做?

c# entity-framework entity-framework-6 .net-6.0 ef-core-6.0
1个回答
0
投票

如果你在谷歌上做了一些调查,你应该会遇到很多存储库模式实现的例子,我只是添加其中的一些。

在 ASP.NET MVC 中实现存储库和工作单元模式

C# 中的 MVC 工作单元和存储库模式

ASP.NET MVC 中的存储库设计模式

存储库模式的 4 个常见错误

© www.soinside.com 2019 - 2024. All rights reserved.