C# .NET 8 — 使用 MediatR 流式传输请求和管道

💡 原文中文,约9000字,阅读约需22分钟。
📝

内容提要

MediatR是一个简单调解器实现的库,本文探讨了MediatR中请求的异常处理过程,特别关注只有一个接收方的场景。流请求用于使用MediatR检索一组流数据。文章提供了示例代码和实现细节。

🔎

延伸解读

流式请求与普通请求的核心差异

MediatR 的流式请求使用 IStreamRequest 接口,返回 IAsyncEnumerable 集合,允许逐个返回数据。与普通请求不同,它专为检索一组流数据设计,且只有一个接收方。这种模式适合需要实时处理或分批获取数据的场景,调用方可以在数据到达时立即处理,而不必等待全部数据就绪。

管道行为在流式请求中的两种应用方式

文章展示了两种流管道行为:GenericStreamLoggingBehavior 通过泛型应用于所有 IStreamRequest,实现统一的日志记录;SampleFilterStreamBehavior 则通过 where 子句限定特定请求类型,实现针对性的权限检查。前者提供集中控制,后者提供灵活扩展,开发者可根据需求选择全局或特定管道。

流式管道中的权限过滤与取消机制

在 SampleFilterStreamBehavior 中,每个流元素返回前都会调用 _authService.OperationAlowed() 进行权限检查,只有成功时才 yield return,否则记录警告并跳过。同时,示例代码在 GetStream 和 Handle 方法中均检查 CancellationToken,支持在客户端取消请求时及时终止流,避免资源浪费。

❓

Q&A

MediatR是什么,它的主要功能是什么?

MediatR是一个简单调解器实现的库,主要用于处理请求的异常处理过程。

流请求在MediatR中是如何工作的?

流请求使用特定接口IStreamRequest,允许逐个返回数据,返回对象是一个集合IAsyncEnumerable。

如何在MediatR中实现流管道行为?

流管道行为可以通过实现IStreamPipelineBehavior接口来创建,提供灵活性和可扩展性。

SampleStreamEntity和SampleStreamEntityWithPipeFilter有什么区别?

SampleStreamEntity使用纯IStreamRequest从数据库检索数据,而SampleStreamEntityWithPipeFilter包含用于筛选的管道行为。

如何在C#中使用MediatR处理流数据?

可以使用async和yield关键字结合IAsyncEnumerable来逐个返回流数据,允许调用方立即处理数据。

在MediatR中如何注册依赖项以确保管道行为的应用?

可以在域项目中使用扩展方法注册所有依赖项,例如使用services.AddTransient注册IStreamPipelineBehavior。

🏷️

标签

➡️

继续阅读