c# - DDD、CQRS 和 Mediatr 查询过滤
问题描述
我正在开发一个遵循 CQRS 和 Mediatr 模式的项目。
我有一个像这样设置的实体
public class Order
{
public Guid OrderId { get; set; }
public Guid CreatedByUserId { get; set; }
public Guid? AcceptedByUserId { get; set; }
public string Registration { get; set; }
public string Description { get; set; }
public User CreatedByUser { get; set; }
public User AcceptedByUser { get; set; }
}
当我编写我的 2 个查询 GetAllOrdersCreatedByUser 和 GetAllOrdersAcceptedByUser 时,所有代码几乎都是相同的。
唯一的例外是在 Created 查询中我的 where 在 CreatedByUserId 上,而我的 Accepted 查询在 AcceptedByUserId 上
GetAllOrdersAcceptedByUser :-
public async Task<OrderAcceptedByUserListViewModel> Handle(GetAllOrdersAcceptedByUserQuery request, CancellationToken cancellationToken)
{
var model = new OrderAcceptedByUserListViewModel
{
Orders = await _context.Order
.Where(x => x.AcceptedByUserId == request.UserId)
.Select(OrderDto.Projection)
.OrderBy(o => o.Registration)
.ToListAsync(cancellationToken)
};
return model;
}
GetAllOrdersCreatedByUser:-
public async Task<OrderCreatedByUserListViewModel> Handle(GetAllOrdersCreatedByUserQuery request, CancellationToken cancellationToken)
{
var model = new OrderCreatedByUserListViewModel
{
Orders = await _context.Order
.Where(x => x.CreatedByUserId == request.UserId)
.Select(OrderDto.Projection)
.OrderBy(o => o.Registration)
.ToListAsync(cancellationToken)
};
return model;
}
这是正确的实现,还是客观上更好地拥有 1 个查询,这取决于它是如何从控制器调用的?
编辑:添加了更好的标签
解决方案
您可以将规范模式应用于查询,即一个以谓词作为参数的查询。
但是 DDD 提倡使用一种普遍存在的语言,如果您的用户不使用谓词,而是使用具体方法名称,我会向用户提供 2 个查询,然后如果您不想重复代码,两个查询都会调用使用谓词的通用查询。
推荐阅读
- reactjs - next.js 图片是透明的
- ubuntu - 如何解压缩包含图像数据集的多个 Xtar.gzY 文件
- r - 在 R 中的数据框中查找日期
- reactjs - 在反应中刷新一个antd TabPane onChange
- prisma - 在这种情况下如何使用 $transaction API?
- google-cloud-platform - 为什么我在使用 Google Translate API 时收到 403 Forbidden “User Rate Limit Exceeded”?
- ios - 允许用户为 Stripe Express 账户输入财务信息?
- sql-server - SQL Server 2017 将预先存在的数据添加到时态表的实践经验
- javascript - 你如何格式化一个 json 参数对象,以便它在模板中正确调用?
- python - ord() 如何将字节转换为 int