You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

在CQRS+MediatR架构项目中用Redis实现购物篮存储的方案咨询

Redis购物篮在CQRS+MediatR项目中的实现方案

你的核心疑问其实是如何在现有CQRS/MediatR架构下,合理整合Redis购物篮的操作逻辑,下面分几种方案分析,并给出最优建议:

1. 沿用MediatR+CQRS模式(推荐,保持一致性)

既然你的项目已经用MediatR处理数据库操作,直接将Redis购物篮的操作也纳入这套体系是最合理的选择,能保证代码风格统一,团队成员不需要额外学习新的模式。

具体做法:

  • 为购物篮的每个操作创建对应的Query/Command:比如GetBasketByIdQuery(查询)、AddItemToBasketCommand(新增商品)、UpdateBasketCommand(更新)、DeleteBasketCommand(删除)。
  • 每个Query/Command对应独立的Handler,Handler中只处理业务逻辑,Redis的具体访问逻辑交给专门的仓储类。
  • 示例代码结构:
// 查询请求
public class GetBasketByIdQuery : IRequest<BasketDto>
{
    public Guid BasketId { get; set; }
}

// 查询处理器
public class GetBasketByIdQueryHandler : IRequestHandler<GetBasketByIdQuery, BasketDto>
{
    private readonly IBasketRepository _basketRepo;
    private readonly IMapper _mapper;

    public GetBasketByIdQueryHandler(IBasketRepository basketRepo, IMapper mapper)
    {
        _basketRepo = basketRepo;
        _mapper = mapper;
    }

    public async Task<BasketDto> Handle(GetBasketByIdQuery request, CancellationToken cancellationToken)
    {
        var basket = await _basketRepo.GetBasketAsync(request.BasketId);
        return _mapper.Map<BasketDto>(basket);
    }
}

2. 仓储模式封装Redis操作(必选,解耦数据访问)

不管是否用MediatR,都应该用仓储模式来封装Redis的所有操作细节,避免业务逻辑层直接和Redis交互。

具体做法:

  • 定义IBasketRepository接口,包含购物篮的所有操作方法:GetBasketAsync、UpdateBasketAsync、DeleteBasketAsync等。
  • 实现RedisBasketRepository类,处理Redis的连接、序列化/反序列化、Key管理等具体逻辑。
  • 示例代码:
public interface IBasketRepository
{
    Task<Basket> GetBasketAsync(Guid basketId);
    Task<Basket> UpdateBasketAsync(Basket basket);
    Task<bool> DeleteBasketAsync(Guid basketId);
}

public class RedisBasketRepository : IBasketRepository
{
    private readonly IDatabase _redisDb;

    public RedisBasketRepository(IConnectionMultiplexer redis)
    {
        _redisDb = redis.GetDatabase();
    }

    public async Task<Basket> GetBasketAsync(Guid basketId)
    {
        var json = await _redisDb.StringGetAsync($"basket:{basketId}");
        return json.IsNullOrEmpty ? null : JsonSerializer.Deserialize<Basket>(json);
    }

    // 其他操作的Redis实现...
}

3. 单独创建服务类(仅适合简单场景)

如果购物篮的逻辑非常简单,没有复杂的业务规则,也可以直接写一个BasketService类来处理所有操作,但这种方案会破坏你现有项目的CQRS/MediatR架构一致性,后续扩展时容易出现代码混乱,不推荐在已有CQRS模式的项目中使用。

最优组合:MediatR+仓储模式

将两者结合是最适合你的方案:

  • 用MediatR的Query/Command统一处理业务请求,保持架构一致性;
  • 用仓储类封装Redis的底层操作,实现数据访问层和业务逻辑层的解耦;
  • 你提供的参考仓库也是采用这种方案,完全可以参考其实现思路。

内容的提问来源于stack exchange,提问作者luca88

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.02 19:31:35