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>();

знал бы, о чем я говорю.

Во всяком случае, если вы получите такие ошибки, вы будете знать, что искать!

Другие вопросы по тегам