c# - 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”用例,并且没有一个真正涉及过滤/分页/身份等“现实世界”问题
如果有人有任何想法,请指出正确的方向
解决方案
我们正在使用 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);
}
推荐阅读
- sftp - chroot 没有更改到主目录
- reactjs - 如何防止用户在不使用 redux 登录的情况下手动访问仪表板
- c# - NSubstitute ForPartsOf 模拟除一个之外的所有方法?
- excel - 使用 RangeToHTML (VBA) 时保持文本格式
- android - 错误:程序类型已存在:com.marcohc.robotocalendar.BuildConfig
- java - JMAP 会导致 Full GC 吗?
- json - 有没有办法将不同的变量与 json 进行比较?
- go - 未命名结构类型的方法
- android - 在项目中使用 Realm 符合 Google Play 64 位
- symfony - 有没有办法在我的处理程序方法中确定哪些订阅的事件触发了处理程序?