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

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);
}

额外说明

  1. 原先添加的[assembly: Xamarin.Forms.Dependency]特性已经没有作用,可以直接删除
  2. 如果是MAUI Blazor架构,不需要额外定义委托,直接在各平台的MauiProgram.cs配置中往MauiAppBuilder.Services注册对应实现即可
  3. 配置完成后直接在Blazor组件中用@inject IStorage Storage即可正常注入使用

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.07 14:06:04