SimpleIoc MvvmLight ломается в приложениях Xamarin Forms 1.3 для Android и iOS, но не в Windows Phone
Я работаю над приложением Xamarin Forms, и все идет хорошо при сборке и запуске Windows Phone. Однако, когда я пытаюсь запустить версию Android, она строится нормально, а затем не удается, и я получаю исключение при вызове ServiceLocator для разрешения ViewModel в ViewModelLocator.
Разрывы на строке в 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 от других? Кто-нибудь использовал SimpleIoc в Xamarin 1.3+?
Должен ли я использовать фабрику для создания модели ViewModel?
Любая помощь будет большой и высоко ценится. Я использую все последние версии для MVVMLight (5.1.0.1) и Xamarin (1.3.3).
1 ответ
Я наконец-то понял, в чем проблема, и она довольно проста и не имеет ничего общего с обновлениями MvvmLight и / или Xamarin Forms!
Я сделал ошибку, зарегистрировав конкретный класс на фабрике, а затем попытался выполнить GetInstance на интерфейсе. SimpleIoC не смог с этим смириться.
из кода выше
SimpleIoc.Default.Register(() => (SettingsHelper.GetCurrentSettings(prefService)));
должно было
SimpleIoc.Default.Register<IPreferenceService>(() => (SettingsHelper.GetCurrentSettings(prefService)));
так что линия
var prefService = ServiceLocator.Current.GetInstance<IPreferenceService>();
знал бы, о чем я говорю.
Во всяком случае, если вы получите такие ошибки, вы будете знать, что искать!