Xamarin.Forms迁移.NET 7 Maui时依赖服务注册致崩溃求助
解决.NET MAUI迁移中DependencyService注册导致HttpClient崩溃的问题
改用MAUI内置依赖注入系统替代Xamarin.DependencyService
MAUI不再推荐使用Xamarin的DependencyService,而是采用.NET原生依赖注入体系。将服务注册逻辑从AppDelegate.cs迁移到MauiProgram.cs的CreateMauiApp方法中:var builder = MauiApp.CreateBuilder(); builder .UseMauiApp<App>() // 注册业务服务 .Services.AddTransient<IWorkService, WorkService>() .Services.AddTransient<ISalesService, SalesService>(); // 推荐通过IHttpClientFactory管理HttpClient生命周期 builder.Services.AddHttpClient(); return builder.Build();后续在页面、ViewModel中通过构造函数注入获取服务实例,替代
DependencyService.Get<IWorkService>()的调用方式:public class MainViewModel { private readonly IWorkService _workService; public MainViewModel(IWorkService workService) { _workService = workService; } }排查服务构造函数的HttpClient使用问题
检查WorkService和SalesService的实现细节:- 禁止直接
new HttpClient(),改用注入IHttpClientFactory创建实例,MAUI框架会统一管理HttpClient的连接池与生命周期,避免资源冲突。 - 确认服务间无循环依赖(如A依赖B、B又依赖A),循环依赖会导致实例化失败,进而触发NullReferenceException。
- 禁止直接
添加全局异常捕获定位问题根源
异步方法的未捕获异常无法被局部try-catch捕获,可在App.xaml.cs中添加全局异常处理,获取NullReferenceException的具体堆栈信息:protected override void OnStart() { AppDomain.CurrentDomain.UnhandledException += (sender, e) => { var exception = e.ExceptionObject as Exception; Console.WriteLine($"未处理异常堆栈: {exception?.StackTrace}"); }; TaskScheduler.UnobservedTaskException += (sender, e) => { e.SetObserved(); Console.WriteLine($"异步未处理异常堆栈: {e.Exception.StackTrace}"); }; }清理AppDelegate中的旧注册代码
彻底删除AppDelegate.cs的FinishedLaunching方法内的DependencyService.Register语句,避免新旧服务注册机制冲突。
内容的提问来源于stack exchange,提问作者Dev
相关产品推荐
相关产品推荐

