Blazor .NET 8自动渲染项目中Mediatr模式实现及依赖处理咨询
Blazor 8 自动渲染项目集成MediatR 解决方案
一、无需中间服务直接集成MediatR
完全可以不用额外创建中间服务,直接在Blazor组件中结合整洁架构使用MediatR模式。核心思路是把命令/查询定义在应用层,对应的处理程序也放在应用层,组件直接注入IMediator发送请求即可,完全契合整洁架构的分层原则。
实现步骤
安装MediatR包
在Server、Wasm以及应用层项目中安装对应包:Install-Package MediatR Install-Package MediatR.Extensions.Microsoft.DependencyInjection注册MediatR服务
- Server项目
Program.cs中注册并扫描应用层程序集:builder.Services.AddMediatR(cfg => cfg.RegisterServicesFromAssembly(typeof(CreateTodoCommand).Assembly)); - Wasm项目
Program.cs中执行同样的注册操作(确保应用层程序集能被Wasm加载):builder.Services.AddMediatR(cfg => cfg.RegisterServicesFromAssembly(typeof(CreateTodoCommand).Assembly));
- Server项目
定义命令/查询与处理程序
以创建待办事项为例,在应用层编写代码:// 命令定义 public record CreateTodoCommand(string Title) : IRequest<int>; // 处理程序 public class CreateTodoCommandHandler : IRequestHandler<CreateTodoCommand, int> { private readonly ITodoRepository _todoRepository; public CreateTodoCommandHandler(ITodoRepository todoRepository) { _todoRepository = todoRepository; } public async Task<int> Handle(CreateTodoCommand request, CancellationToken cancellationToken) { var todo = new Todo(request.Title); await _todoRepository.AddAsync(todo); return todo.Id; } }组件中直接调用MediatR
在任意Blazor组件(支持SSR/Wasm自动渲染)中注入IMediator并发送请求:@inject IMediator Mediator @page "/todo/create" <input @bind="newTodoTitle" placeholder="输入待办事项标题" /> <button @onclick="CreateTodo">创建</button> @code { private string newTodoTitle = string.Empty; private async Task CreateTodo() { if (!string.IsNullOrWhiteSpace(newTodoTitle)) { var command = new CreateTodoCommand(newTodoTitle); var todoId = await Mediator.Send(command); // 后续逻辑:跳转、提示等 } } }
二、解决WebAssembly服务注入丢失问题
Wasm端出现MediatR服务注入丢失,通常是注册配置或程序集扫描问题,按以下步骤排查修复:
1. 确保Wasm能扫描到处理程序程序集
- 确认Wasm项目已引用包含MediatR处理程序的应用层项目;
- 在Wasm的
Program.cs中明确指定扫描的程序集:builder.Services.AddMediatR(cfg => { cfg.RegisterServicesFromAssembly(typeof(CreateTodoCommandHandler).Assembly); // 多程序集场景可多次调用RegisterServicesFromAssembly });
2. 检查处理程序的依赖兼容性
如果处理程序依赖了仅Server端支持的服务(如EF Core的DbContext),Wasm端会无法注入。解决方式:
- 为Wasm端的命令/查询提供兼容的依赖实现,比如用API调用替代直接操作DbContext;
- 通过条件注册区分Server和Wasm的服务实现:
// Server项目Program.cs builder.Services.AddScoped<ITodoRepository, ServerTodoRepository>(); // Wasm项目Program.cs builder.Services.AddScoped<ITodoRepository, WasmTodoRepository>();
3. 确认服务生命周期配置正确
Blazor Wasm端服务默认是Scoped生命周期,不要手动修改为Singleton等不兼容的生命周期,保持默认配置即可避免注入失败。
4. 排查自动渲染模式的服务作用域
在自动渲染模式中,确保组件通过@inject指令或构造函数注入IMediator,避免在静态方法、非组件类中直接获取服务,保证Wasm端能正确获取Scoped实例。
内容的提问来源于stack exchange,提问作者gbidault
相关产品推荐
相关产品推荐

