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
相关产品推荐
相关产品推荐

