CQRS - 通过域传递复杂的分页/过滤数据

CQRS - Passing complex paging / filtering data through the domain

我正在尝试使用 mediatr 实现 cqrs 模式,所有设置均正确且运行良好。然而,当我尝试在我的观点中实施 devextreme 组件时,我确实遇到了问题。这些组件需要一个接受 DataSourceLoadOptions 对象的端点,该对象然后可以与 DataSourceLoader class 和一个 IQueryable 对象结合使用以自动化 filtering/paging/sorting 等。这段代码很棒,确实摆脱了很多样板文件.

这里是 "old way" 我曾经做过的事情的例子:

[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" 个用例,其中 none 个确实涉及 "real world" 个问题,例如过滤/分页/身份等

如果大家有什么想法,请指点一下

我们用的是KendoUI,但是问题是一样的。对于需要为 UI 完成分页的情况,我们从查询中返回 IQueryable<T>。然后我们有一个测试,确保可以使用纯 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);
}