Xamarin.Forms搭配Mobile Blazor Bindings如何为平台类配置依赖注入
问题根因
你使用的[assembly: Xamarin.Forms.Dependency]是Xamarin.Forms自带的依赖服务容器的注册特性,和Blazor使用的ASP.NET Core标准依赖注入容器完全独立、互不互通,因此Blazor的DI容器无法识别到你注册的IStorage实现类,才会抛出服务无法解析的异常。
解决方案
可以通过平台项目入口注入注册逻辑的方式解决,完全不会触发循环依赖,具体步骤如下:
步骤1:共享Blazor项目暴露服务注册入口
在共享Blazor项目的应用启动类中暴露一个静态委托,作为平台专属服务的注册入口:
// 共享Blazor项目的App.xaml.cs public partial class App : Application { // 平台侧实现的服务注册委托 public static Action<IServiceCollection> AddPlatformServices { get; set; } public App() { InitializeComponent(); var blazorHostBuilder = new BlazorWebViewHostBuilder(); // 此处注册共享项目的其他通用服务 blazorHostBuilder.Services.AddSingleton<YourCommonService>(); // 执行平台侧传入的专属服务注册逻辑 AddPlatformServices?.Invoke(blazorHostBuilder.Services); MainPage = new ContentPage { Content = new BlazorWebView { HostPage = "wwwroot/index.html", Services = blazorHostBuilder.Build() } }; } }
步骤2:Android项目注册IStorage实现
在Android项目的MainActivity.cs入口处,给上述委托赋值,注册Android平台的实现类:
// Android项目的MainActivity.cs protected override void OnCreate(Bundle savedInstanceState) { base.OnCreate(savedInstanceState); Xamarin.Essentials.Platform.Init(this, savedInstanceState); // 注册Android平台专属服务 App.AddPlatformServices = services => { services.AddSingleton<IStorage, AndroidStorageManager>(); }; LoadApplication(new App()); }
步骤3:iOS项目注册IStorage实现
在iOS项目的AppDelegate.cs入口处,同理注册iOS平台的实现类:
// iOS项目的AppDelegate.cs public override bool FinishedLaunching(UIApplication app, NSDictionary options) { Xamarin.Essentials.Platform.Init(() => new UIViewController()); // 注册iOS平台专属服务 App.AddPlatformServices = services => { services.AddSingleton<IStorage, iOSStorageManager>(); }; LoadApplication(new App()); return base.FinishedLaunching(app, options); }
额外说明
- 原先添加的
[assembly: Xamarin.Forms.Dependency]特性已经没有作用,可以直接删除 - 如果是MAUI Blazor架构,不需要额外定义委托,直接在各平台的
MauiProgram.cs配置中往MauiAppBuilder.Services注册对应实现即可 - 配置完成后直接在Blazor组件中用
@inject IStorage Storage即可正常注入使用
内容的提问来源于stack exchange,提问作者user2209634
相关产品推荐
相关产品推荐

