首页 > 解决方案 > CQRS - 通过域传递复杂的分页/过滤数据

问题描述

我正在尝试使用 mediatr 实现 cqrs 模式,并且所有设置都正确并且运行良好。但是,在我的视图中尝试实现 devextreme 组件时,我确实遇到了问题。这些组件需要一个接受 DataSourceLoadOptions 对象的端点,然后该对象可以与 DataSourceLoader 类和 IQueryable 对象耦合以自动进行过滤/分页/排序等。这段代码非常棒,真的摆脱了很多样板文件。

这是我以前做事的“旧方式”的一个例子:

[HttpGet]
public virtual object Get(DataSourceLoadOptions loadOptions)
{
    var queryable = this.context.Set<TEntity>();

    return DataSourceLoader.Load(queryable, loadOptions);
}

如您所见,它确实非常好,但是它是老派的,没有分层,并且将我与 EF 作为持久性机制结合在一起。但是现在用 CQRS 模式替换它会有点棘手,因为我不希望我的应用程序或域甚至数据库层了解 devextreme(它是一种视图技术,必须保留在那里)。我也不太热衷于从 mediatr 响应中返回一个简单的 IQueryable,因为这意味着诸如保持上下文活动/可测试性问题/某些 Linq 查询无法实现 int SQL 等……闻起来很糟糕。

我想知道是否有另一种方法可以以某种方式提取接口,然后创建一个我可以通过 DI 注入的服务来解决这个问题?我真的无法在网上找到任何关于此的资源。像往常一样,所有示例都只是“hello world”用例,并且没有一个真正涉及过滤/分页/身份等“现实世界”问题

如果有人有任何想法,请指出正确的方向

标签: c#cqrsdevextreme

解决方案


我们正在使用 Kendo UI,但问题是一样的。我们正在IQueryable<T>从查询中返回需要为 UI 完成分页的情况。然后我们进行了一个测试,以确保可以使用纯 SQL 执行查询。

像这样的东西:

public class MyProjectQuery : IQuery<IEnumerable<Project>
{
// params
}

[HttpGet]
public virtual object Get(DataSourceLoadOptions loadOptions)
{
    var queryable = _mediator.Query(new MyProjectQuery());

    return DataSourceLoader.Load(queryable, loadOptions);
}

推荐阅读