在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
相关产品推荐
相关产品推荐

