MvvmLight 的 SimpleIoc 在 Xamarin Forms 1.3 Android 和 iOS 应用程序中崩溃,但在 Windows Phone 中没有

MvvmLight's SimpleIoc breaking in Xamarin Forms 1.3 Android and iOS app, but not in Windows Phone

我正在开发 Xamarin Forms 应用程序,Windows Phone 构建和 运行ning 一切顺利。但是,当我尝试 运行 Android 版本时,它构建正常然后失败,并且在调用 ServiceLocator 以解析 ViewModelLocator 中的 ViewModel 时出现异常。

ViewModelLocator 中的行中断

return ServiceLocator.Current.GetInstance<MainViewModel>();

System.Reflection.TargetInvocationException
Source  "mscorlib"  string
StackTrace  "at System.Reflection.MonoMethod.Invoke (object,System.Reflection.BindingFlags,System.Reflection.Bind…"

并将鼠标悬停在 'GetInstance' 上显示

Could not resolve type: global::Microsoft.Practices.ServiceLocation.ServiceLocator.Current.GetInstance<global::hms.BillSplitter.ViewModel.PCL.MainViewModel>

我的 ViewModel 的唯一构造函数看起来像

public MainViewModel(INavigationService navigationService, ICountryTippingService countryTippingService, AppSettings appSettings)
{
    _navigationService = navigationService;
    _countryTippingService = countryTippingService;
    ThisAppSettings = appSettings;
    ThisBillDetail = new BillDetail();
    ThisBillDetail.TotalOnBill = 0;
}

所有依赖项都在 ViewModelLocator 中提前注册,例如

SimpleIoc.Default.Register(() => new HmsPublicCoreMobileServiceClient(HmsCommonSettingConstants.HmsPublicCoreServiceUrl, HmsCommonSettingConstants.HmsPublicCoreServiceAppKey));
var prefService = ServiceLocator.Current.GetInstance<IPreferenceService>();
SimpleIoc.Default.Register(() => (SettingsHelper.GetCurrentSettings(prefService)));

SimpleIoc.Default.Register<MainViewModel>();

以及 MainActivity.cs (Android) 和 AppDelegate(iOS) 中的一些平台特定的,例如

SimpleIoc.Default.Register(() => new PreferenceService(this));

我不明白的是它在 Windows Phone 中运行得很好? Android 有什么不同?有人在 Xamarin 1.3+ 中使用过 SimpleIoc 吗?

我应该使用工厂来创建 ViewModel 吗?

如有任何帮助,我们将不胜感激。我正在使用 MVVMLight (5.1.0.1) 和 Xamarin (1.3.3) 的所有最新版本。

我终于弄清楚了问题所在,它非常基本,与 MvvmLight 无关 and/or Xamarin Forms 更新!

我犯了一个错误,在工厂中注册了一个具体的 class,然后尝试在接口上获取实例。 SimpleIoC 无法协调它。

来自上面的代码

SimpleIoc.Default.Register(() => (SettingsHelper.GetCurrentSettings(prefService)));

应该是

SimpleIoc.Default.Register<IPreferenceService>(() => (SettingsHelper.GetCurrentSettings(prefService)));

所以行

var prefService = ServiceLocator.Current.GetInstance<IPreferenceService>();

会知道我在说什么。

总之,如果你遇到这样的错误,你就会知道该找什么了!!