Maui Blazor中如何为Maui服务与Blazor服务共享ServiceProvider
实现Maui与Blazor共享单例服务的方案
核心原理:MauiBlazor 应用中的Blazor WebView默认不会创建独立的依赖注入容器,和Maui宿主共用同一个IServiceProvider,仅需将服务统一注册到Maui全局DI容器,两边即可获取到同一个单例实例,完全不需要额外维护静态单例。
具体实现步骤
- 第一步:定义公共服务接口和实现类,示例代码如下:
// 公共服务接口 public interface ISharedService { string GetSharedData(); void UpdateSharedData(string data); } // 服务实现 public class SharedService : ISharedService { private string _storedData; public string GetSharedData() => _storedData; public void UpdateSharedData(string data) => _storedData = data; }
- 第二步:在Maui项目的
MauiProgram.cs中注册单例服务,仅需注册一次即可:
public static class MauiProgram { public static MauiApp CreateMauiApp() { var builder = MauiApp.CreateBuilder(); builder .UseMauiApp<App>() .ConfigureFonts(fonts => { fonts.AddFont("OpenSans-Regular.ttf", "OpenSansRegular"); }); builder.Services.AddMauiBlazorWebView(); // 注册共享单例服务 builder.Services.AddSingleton<ISharedService, SharedService>(); return builder.Build(); } }
注意不要在Blazor侧的配置文件或组件中重复注册该服务,重复注册会覆盖原有注册逻辑,导致两边获取的实例不一致
- 第三步:在Maui原生侧使用服务,直接通过构造函数注入即可,示例:
public partial class MainPage : ContentPage { private readonly ISharedService _sharedService; public MainPage(ISharedService sharedService) { InitializeComponent(); _sharedService = sharedService; // 原生侧修改共享数据 _sharedService.UpdateSharedData("来自Maui原生侧的数据"); } }
- 第四步:在Blazor组件侧使用服务,用Blazor原生注入语法即可,示例:
@inject ISharedService SharedService <h3>Blazor组件获取共享数据</h3> <p>当前共享值:@SharedService.GetSharedData()</p> <button @onclick="ModifyData">Blazor侧修改数据</button> @code { private void ModifyData() { SharedService.UpdateSharedData("来自Blazor侧的更新数据"); } }
注意事项
- 多线程场景下操作共享服务的公共属性/方法时,自行加锁保证线程安全即可,用法和普通单例服务完全一致
- 如果出现两边实例不一致的问题,优先排查全局是否有重复注册同服务的逻辑
内容的提问来源于stack exchange,提问作者Jean
相关产品推荐
相关产品推荐

