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

从Xamarin迁移至MAUI后DependencyService.Get返回null的解决咨询

解决MAUI中DependencyService.Get返回null的问题

你不需要重写所有基于DependencyService的代码,MAUI保留了对DependencyService的兼容,只需做以下调整即可解决null问题:

方案1:将平台服务注册到MAUI内置DI(推荐)

MAUI的DependencyService底层已集成到内置依赖注入系统,只需在MauiProgram.cs中针对不同平台注册对应实现,原有DependencyService.Get<IMyService>()的代码完全不用改动:

using Microsoft.Maui.LifecycleEvents;
using MyProject;
#if ANDROID
using MyProject.Android;
#elif IOS
using MyProject.iOS;
#elif WINDOWS
using MyProject.Windows;
#endif

namespace MyProject;

public static class MauiProgram
{
    public static MauiApp CreateMauiApp()
    {
        var builder = MauiApp.CreateBuilder();
        builder
            .UseMauiApp<App>()
            .ConfigureFonts(fonts =>
            {
                fonts.AddFont("OpenSans-Regular.ttf", "OpenSansRegular");
            });

        // 按平台注册服务实例
#if ANDROID
        builder.Services.AddSingleton<IMyService, MyService>();
#elif IOS
        builder.Services.AddSingleton<IMyService, MyService>();
#elif WINDOWS
        builder.Services.AddSingleton<IMyService, MyService>();
#endif

        return builder.Build();
    }
}

注册完成后,原有DependencyService.Get<IMyService>().Test();代码就能正常获取到实例并调用方法。

方案2:保留原有[assembly: Dependency]属性的兼容配置

如果你想继续使用Xamarin时代的[assembly: Dependency]标记方式,需确保以下两点:

  • 平台实现类的[assembly: Dependency(typeof(MyService))]属性必须放在命名空间外部(你的现有代码已经符合要求)。
  • 在App.xaml.cs的构造函数中显式注册服务:
public App()
{
    InitializeComponent();
    // 注册服务接口
    DependencyService.Register<IMyService>();
    MainPage = new MainPage();
}

关键检查项

  • 确保IMyService接口定义在共享/主项目中,所有平台实现都正确引用该接口。
  • 平台实现类必须是public访问级别,且存在无参构造函数(你的现有代码已满足)。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.14 19:31:09