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

.NET MAUI(Android/iOS)复用Xamarin依赖注入代码报错求助

解决.NET MAUI中Xamarin代码复用的依赖注入问题

问题根源在于你仍在沿用Xamarin.Forms的DependencyService调用方式,但.NET MAUI已推荐使用内置的依赖注入(DI)系统,且静态字段的初始化时机早于DI容器构建,直接在静态方法中获取服务会导致失败。以下是具体解决方案:

步骤1:规范接口与实现类命名(推荐)

遵循C#命名规范,将接口名改为ISerial(接口名以I开头):

public interface ISerial
{
    string GetSerial();
}

步骤2:调整平台实现类

保留原有平台逻辑,确保实现类为公共类,且放在对应平台目录下:

Android平台实现(Platforms/Android目录)

public class Serial : ISerial
{
    public string GetSerial()
    {
        return Android.Provider.Settings.Secure.GetString(
            Android.App.Application.Context.ContentResolver, 
            Android.Provider.Settings.Secure.AndroidId);
    }
}

iOS平台实现(Platforms/iOS目录)

public class Serial : ISerial
{
    public string GetSerial()
    {
        return UIDevice.CurrentDevice.IdentifierForVendor.ToString();
    }
}

步骤3:确认服务注册正确性

确保MauiProgram.cs中的注册代码与接口/实现类命名匹配:

builder.Services.AddSingleton<ISerial, Serial>();

步骤4:替换DependencyService,改用DI获取服务

方式一:构造函数注入(推荐,适用于页面/ViewModel)

在需要使用服务的类中,通过构造函数注入ISerial,避免静态初始化时机问题:

public class YourPageViewModel
{
    private readonly ISerial _serialService;
    private string _deviceSerial;

    // 构造函数注入服务
    public YourPageViewModel(ISerial serialService)
    {
        _serialService = serialService;
        _deviceSerial = _serialService.GetSerial();
    }

    // 按需获取序列号
    public string GetDeviceSerial()
    {
        return _serialService.GetSerial();
    }
}

方式二:延迟加载静态字段(仅在必须使用静态时)

若需保留静态字段,通过MauiProgram暴露的服务提供者延迟获取:

  1. 在MauiProgram.cs中添加静态服务提供者属性:
public static IServiceProvider Services { get; private set; }

public static MauiApp CreateMauiApp()
{
    var builder = MauiApp.CreateBuilder();
    // 其他配置代码
    builder.Services.AddSingleton<ISerial, Serial>();
    
    var app = builder.Build();
    Services = app.Services; // 保存服务提供者实例
    return app;
}
  1. 延迟加载静态字段:
private static string _serial;
public static string Serial
{
    get
    {
        if (_serial == null)
        {
            var serialService = MauiProgram.Services.GetRequiredService<ISerial>();
            _serial = serialService.GetSerial();
        }
        return _serial;
    }
}

关键注意事项

  • .NET MAUI中DependencyService虽仍兼容,但官方推荐使用内置DI系统,更贴合现代.NET开发规范。
  • 静态初始化代码执行早于DI容器构建,因此不能在静态字段初始化阶段直接获取DI服务,必须采用延迟加载或构造注入。
  • 平台特定代码需放在Platforms目录下对应平台的文件夹中,MAUI会自动根据运行平台加载对应实现。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.02 06:50:11