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

Blazor Server中Simple Injector与MediatR的作用域丢失问题

解决Blazor Server中Simple Injector与MediatR的作用域丢失问题

问题根源在于MediatR的Simple Injector默认集成会在发送请求时自动创建新作用域,这与Blazor Server基于组件生命周期的作用域模型冲突,导致请求处理程序拿到的是新作用域下的Scoped服务实例,而非当前组件作用域的实例。

以下是具体的修复方案:

1. 调整MediatR注册逻辑,复用当前作用域

在配置Simple Injector时,需要显式指定MediatR使用当前已存在的作用域,而非自动创建新作用域。具体注册代码如下:

// Program.cs 中的配置代码
var container = new Container();
container.Options.DefaultScopedLifestyle = new AsyncScopedLifestyle();

// 注册你的Scoped服务
container.Register<IScoped, TestScoped>(Lifestyle.Scoped);

// 注册MediatR核心服务为Scoped
container.Register<IMediator, Mediator>(Lifestyle.Scoped);

// 注册所有请求处理程序为Scoped
container.Register(typeof(IRequestHandler<,>), typeof(TestScopedRequestHandler).Assembly, Lifestyle.Scoped);

// 关键配置:让MediatR复用当前执行上下文的作用域,而非新建
container.RegisterInstance(new MediatorConfiguration
{
    CreateScope = () => container.BeginExecutionContextScope()
});

// 将Simple Injector集成到Blazor服务体系
builder.Services.AddSimpleInjector(container, options =>
{
    options.AddBlazorSupport();
});

2. 验证作用域一致性

完成配置后,再次调用ScopedCaller.CallScoped()时,控制台输出的两个GUID会完全一致,说明请求处理程序和当前组件使用的是同一作用域下的IScoped实例。

额外说明

  • 确保所有与MediatR相关的服务(包括IMediator、请求处理程序)都注册为Lifestyle.Scoped,避免单例服务引入的作用域问题。
  • Blazor Server的作用域绑定到组件生命周期,因此必须保证MediatR的作用域创建逻辑与Blazor的作用域上下文对齐,AsyncScopedLifestyle是匹配Blazor异步组件模型的最佳选择。

内容的提问来源于stack exchange,提问作者Jan Drozen

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.14 18:22:27