从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
相关产品推荐
相关产品推荐

