MVVMCross 6.0.1构造函数依赖注入失效排查求助
问题诊断与修复方案
我帮你排查了这个MvvmCross 6 + Xamarin.Forms项目里的IUserDialogs注入空引用问题,核心原因是平台层未完成IUserDialogs的初始化绑定,结合你的项目情况,具体修复步骤如下:
1. 确认核心项目的注册逻辑
先检查App.cs里的Initialize方法,确保IUserDialogs用正确方式注册为单例:
public override void Initialize() { // 注册Service类 CreatableTypes() .EndingWith("Service") .AsInterfaces() .RegisterAsLazySingleton(); // 关键:用UserDialogs.Instance注册单例,不能直接new接口 Mvx.IoCProvider.RegisterSingleton<IUserDialogs>(() => UserDialogs.Instance); // 注册启动ViewModel或自定义AppStart RegisterAppStart<LoginViewModel>(); }
2. 完成各平台的IUserDialogs初始化
IUserDialogs是依赖平台的服务,必须在Android/iOS项目里手动初始化:
Android平台(MainApplication.cs)
在OnCreate方法中添加初始化代码:
public override void OnCreate() { base.OnCreate(); // 初始化Acr.UserDialogs的Android实现 UserDialogs.Init(this); // 其他MvvmCross初始化逻辑 }
iOS平台(AppDelegate.cs)
在FinishedLaunching方法中添加初始化代码:
public override bool FinishedLaunching(UIApplication app, NSDictionary options) { // 初始化Acr.UserDialogs的iOS实现 UserDialogs.Init(); // 其他MvvmCross初始化逻辑 return base.FinishedLaunching(app, options); }
3. 验证ViewModel的注入逻辑
确保LoginViewModel由MvvmCross的IoC容器创建,不要手动实例化:
public class LoginViewModel : MvxViewModel { private readonly IMvxNavigationService _navigationService; private readonly IUserDialogs _userDialogs; // 正确的构造函数注入方式 public LoginViewModel(IMvxNavigationService navigationService, IUserDialogs userDialogs) { _navigationService = navigationService; _userDialogs = userDialogs; // 可添加测试提示验证注入是否成功 _userDialogs.Alert("IUserDialogs注入成功!"); } // 其他业务逻辑... }
4. 排查自定义AppStart的问题
如果你用了自定义AppStart,一定要通过MvvmCross导航服务启动ViewModel,不要手动new:
public class CustomAppStart : MvxAppStart<LoginViewModel> { public CustomAppStart(IMvxApplication application, IMvxNavigationService navigationService) : base(application, navigationService) { } protected override void NavigateToFirstViewModel(object hint = null) { // 交给MvvmCross处理ViewModel的创建与注入 base.NavigateToFirstViewModel(hint); } }
为什么移除IUserDialogs就正常?
IMvxNavigationService是MvvmCross内置核心服务,框架初始化时已自动完成注册绑定,所以注入不会出问题。而IUserDialogs是第三方扩展服务(来自Acr.UserDialogs库),必须手动完成平台初始化和IoC注册,缺任何一步都会导致注入时拿到空引用。
内容的提问来源于stack exchange,提问作者Dan Pollack
相关产品推荐
相关产品推荐

