You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Blazor .NET 8自动渲染项目中Mediatr模式实现及依赖处理咨询

Blazor 8 自动渲染项目集成MediatR 解决方案

一、无需中间服务直接集成MediatR

完全可以不用额外创建中间服务,直接在Blazor组件中结合整洁架构使用MediatR模式。核心思路是把命令/查询定义在应用层,对应的处理程序也放在应用层,组件直接注入IMediator发送请求即可,完全契合整洁架构的分层原则。

实现步骤

  1. 安装MediatR包
    在Server、Wasm以及应用层项目中安装对应包:

    Install-Package MediatR
    Install-Package MediatR.Extensions.Microsoft.DependencyInjection
    
  2. 注册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));
      
  3. 定义命令/查询与处理程序
    以创建待办事项为例,在应用层编写代码:

    // 命令定义
    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;
        }
    }
    
  4. 组件中直接调用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.25 07:31:30