首页 > 解决方案 > 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 个查询,这取决于它是如何从控制器调用的?

编辑:添加了更好的标签

标签: c#domain-driven-designdbcontextcqrsmediatr

解决方案


您可以将规范模式应用于查询,即一个以谓词作为参数的查询。

但是 DDD 提倡使用一种普遍存在的语言,如果您的用户不使用谓词,而是使用具体方法名称,我会向用户提供 2 个查询,然后如果您不想重复代码,两个查询都会调用使用谓词的通用查询。


推荐阅读