通过 MediatR 实现了请求的分发和处理器的解耦
1. 前端请求发起
- 假设前端通过 HTTP GET 请求访问
GetTemplateSettings
端点,URL 中包含了SubjectUuid
和SubjectType
作为查询参数。
2. 进入 Controller 方法
- 请求到达后,会进入
MinBcController
类中的GetTemplateSettings
方法,该方法是通过[HttpGet("GetTemplateSettings")]
特性绑定的。 GetTemplateSettings
方法接收一个GetTemplateSettingsRequest
类型的参数,该参数由FromQuery
特性指定从 URL 查询参数中绑定。
[HttpGet("GetTemplateSettings")]
public async Task<Result<TemplateSettingsVO>> GetTemplateSettings([FromQuery] GetTemplateSettingsRequest request)
{
var data = await mediator.Send(request);
return new Result<TemplateSettingsVO>(data);
}- public record GetTemplateSettingsRequest(string SubjectUuid, SubjectType SubjectType) : IRequest<TemplateSettingsVO>;
3. 请求通过 MediatR 分发
- 在
GetTemplateSettings
方法内部,通过调用mediator.Send(request)
将GetTemplateSettingsRequest
请求对象发送给 MediatR 进行处理。
4. MediatR 查找并执行处理器
- MediatR 接收到
GetTemplateSettingsRequest
请求后,会根据该请求的类型GetTemplateSettingsRequest
,找到对应的处理器GetTemplateSettingsRequestHandler
。 GetTemplateSettingsRequestHandler
是IRequestHandler<GetTemplateSettingsRequest, TemplateSettingsVO>
的实现类,负责处理类型为GetTemplateSettingsRequest
的请求并返回TemplateSettingsVO
类型的结果。
5. 处理器执行业务逻辑
GetTemplateSettingsRequestHandler
类的Handle
方法被调用。此方法接受GetTemplateSettingsRequest
对象作为参数,并通过IWeuuSession
、IUserService
、CardDbContext
等服务执行相关的业务逻辑。- 业务逻辑处理完成后,
Handle
方法返回一个TemplateSettingsVO
对象。
- public class GetTemplateSettingsRequestHandler(IWeuuSession session, IUserService userService, CardDbContext cardContext)
: IRequestHandler<GetTemplateSettingsRequest, TemplateSettingsVO>
{
public async Task<TemplateSettingsVO> Handle(GetTemplateSettingsRequest request,
CancellationToken cancellationToken)
{
//其他代码
return v;
}
}
6. 返回处理结果
- MediatR 将
Handle
方法返回的TemplateSettingsVO
对象返回给GetTemplateSettings
方法中的data
变量。 GetTemplateSettings
方法将TemplateSettingsVO
包装在Result<TemplateSettingsVO>
对象中,并作为 HTTP 响应返回给前端。
7. 前端收到响应
- 最终,前端接收到包含
TemplateSettingsVO
数据的 HTTP 响应,并根据该数据进行后续处理。
总结
整个流程通过 MediatR 实现了请求的分发和处理器的解耦,使得 Controller 层只需要关心如何将请求发送给 MediatR,而业务逻辑则集中在处理器中处理。这种设计提高了代码的可维护性和可扩展性。