xamarininversion-of-controlmvvm-lightxamarin.formscommon-service-locator

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


I am working on a Xamarin Forms app and all is going well with the Windows Phone building and running. However when I try and run the Android version, it build OK and then fails and I get an exception when calling the ServiceLocator to resolve ViewModel in the ViewModelLocator.

Breaks on the line in the ViewModelLocator

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

with

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

and hovering over the 'GetInstance' shows

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

My ViewModel's only constructor looks like

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

All dependencies are registered ahead of this in the ViewModelLocator e.g.

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

and some platform specific ones in the MainActivity.cs (Android) and AppDelegate(iOS) e.g.

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

What I don't get is that it work beautifully in Windows Phone? What is it about Android that's different? Has anyone used SimpleIoc in Xamarin 1.3+?

Should I use a factory to create he ViewModel?

Any help would be great and much appreciated. I am using all the latest versions for MVVMLight (5.1.0.1) and Xamarin (1.3.3).


Solution

  • I finally worked out what the problem was and it's pretty basic and nothing to do with MvvmLight and/or Xamarin Forms updates!

    I made the mistake of Registering a concrete class in a factory and then attempted to GetInstance on an Interface. SimpleIoC was not able to reconcile it.

    from the code above

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

    should have been

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

    so that the line

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

    would know what I was talking about.

    Anyhow, if you get errors like this, you'll know what to look for!!