2017-08-10 1 views
0

Donc, je suis encore nouveau sur MVVM (MvvmCross)/Android. Alors excusez si je fais quelque chose de vraiment stupide. J'ai suivi Stuart Lodge sur N = 9 vidéo sur "MvxGeoLocation" et "IMvxMessenger" et je suis sûr que je l'ai suivi parfait, mais je ne sais pas où je vais mal.Comment utiliser IoC Constructor Injection (MvvmCross (MvvmCross.Platform.Exceptions.MvxIoCResolveException))

Cependant, mon application est incapable de résoudre une interface du constructeur.

App.cs:

public override void Initialize() 
{ 
    CreatableTypes() 
     .EndingWith("Service") 
     .AsInterfaces() 
     .RegisterAsLazySingleton(); 

    RegisterAppStart<ViewModels.MainViewModel>(); 
} 

MainViewModel.cs:

public MainViewModel(ILocationService locationService, IMvxMessenger messenger) 
{ 
    _subscriptionToken = messenger.Subscribe<LocationMessage>(OnLocationMessage); 
} 

LocationService.cs:

Public class LocationService : ILocationService 
{ 
    private readonly MvxLocationWatcher _locationWatcher; 
    private readonly IMvxMessenger _messenger; 

    public LocationService(MvxLocationWatcher locationWatcher, IMvxMessenger messenger) 
    { 
     _locationWatcher = locationWatcher; 
     _messenger = messenger; 
     if (!_locationWatcher.Started) _locationWatcher.Start(new MvxLocationOptions(), OnLocation, OnError); 
    } 

    private void OnLocation(MvxGeoLocation location) 
    { 
     System.Diagnostics.Debug.WriteLine(location.Coordinates.Longitude.ToString(), location.Coordinates.Latitude); 
     var message = new LocationMessage(this, location.Coordinates.Longitude, location.Coordinates.Latitude); 
     _messenger.Publish(message); 
    } 

    public void CustomLocation(double lng, double lat) 
    { 
     var message = new LocationMessage(this, lng, lat); 
     _messenger.Publish(message); 
    } 

    private void OnError(MvxLocationError error) 
    { 
     Mvx.Error(error.Code.ToString()); 
    } 
} 

public class LocationMessage : MvxMessage 
{ 
    public LocationMessage(object sender, double lng, double lat) : base(sender) 
    { 
     Lng = lng; 
     Lat = lat; 
    } 

    public double Lng { get; private set; } 
    public double Lat { get; private set; } 
} 

maintenant l'interface ILocationService est vide. C'est là pour des raisons d'IoC. Maintenant, quand je lance l'application, il se bloque sur l'activité MainView sur "base.OnCreate (bundle);".

Maintenant dans la méthode InitializeIoC de remplacement je ne peux même pas faire "Mvx.RegisterSingleton (new LocationService());" parce que je dois donner des arguments que je ne peux clairement pas. J'ai même essayé d'utiliser "Mvx.IocConstruct();", mais j'ai réalisé que cela ne fonctionnerait pas car MvvmCross le fait automatiquement.


Donc, le message d'erreur:

Impossible de construire et initialiser ViewModel pour le type Core.ViewModels.MainViewModel de localisateur MvxDefaultViewModelLocator - vérifier InnerException pour plus d'informations

InnerException:

{MvvmCross.Platform.Exceptions.MvxException: Problème création viewmodel de type MainViewModel ---> MvvmCross.Platform.Exceptions.MvxIoCResolveException: Impossible de résoudre le paramètre pour le paramètre locationService de type ILocationService lors de la création Core.ViewModels.MainViewModel à MvvmCross .Platform.IoC.MvxSimpleIoCContainer.GetIoCParameterValues ​​(type System.Type, System.Reflection.ConstructorInfo firstConstructor) [0x00036] dans C: \ projects \ mvvmcross \ MvvmCross \ Plate-forme \ Platform \ IoC \ MvxSimpleIoCContainer.cs: 502 à MvvmCross.Platform .IoC.MvxSimpleIoCContainer.IoCConstruct (type System.Type) [0x0002c] dans C: \ projects \ mvvmcross \ MvvmCross \ Platform \ Plate-forme \ IoC \ MvxSimpleIoCContainer.cs: 312 à MvvmCross.Platform.Mvx.IocConstruct (System.Type t) [0x00006] dans C: \ projets \ mvvmcross \ MvvmCross \ Platform \ Platform \ Mvx.cs: 1 69 à MvvmCross.Core.ViewModels.MvxDefaultViewModelLocator.Load (System.Type viewModelType, MvvmCross.Core.ViewModels.IMvxBundle ParameterValues, MvvmCross.Core.ViewModels.IMvxBundle savedState) [0x00000] dans C: \ projets \ mvvmcross \ MvvmCross \ Core \ Core \ ViewModels \ MvxDefaultViewModelLocator.cs: 33 --- Fin de trace de pile d'exception interne --- à MvvmCross.Core.ViewModels.MvxDefaultViewModelLocator.Load (System.Type viewModelType, MvvmCross.Core.ViewModels.IMvxBundle ParameterValues, MvvmCross .Core.ViewModels.IMvxBundle savedState) [0x0000f] dans C: \ projets \ mvvmcross \ MvvmCross \ Core \ Core \ ViewModels \ MvxDefaultViewModelLocator.cs: 37 à MvvmCross.Core.ViewModels.MvxViewModelLoader.LoadViewModel (MvvmCross.Core.ViewModels.MvxViewModelRequest demande, MvvmCross. Core.ViewModels.IMvxBundle savedState, MvvmCross.Core.ViewModels.IMvxViewModelLocator viewModelLocator) [0x0000e] dans C: \ projects \ mvvmcross \ MvvmCross \ Core \ Core \ ViewModels \ MvxViewModelLoader.cs: 69}

pourrait-elle fournir StackTrace si besoin. Alors qu'est-ce que je fais exactement de mal? J'ai passé tellement de temps à essayer de comprendre cela. Aucune idée.

Mise à jour:

Ajout StackTrace (Incase il est utile):

"à MvvmCross.Core.ViewModels.MvxViewModelLoader.LoadViewModel (MvvmCross.Core.ViewModels.MvxViewModelRequest demande, MvvmCross.Core .ViewModels.IMvxBundle savedState, MvvmCross.Core.ViewModels.IMvxViewModelLocator viewModelLocator) [0x00020] dans C: \ projets \ mvvmcross \ MvvmCross \ Core \ Core \ ViewModels \ MvxViewModelLoader.cs: 73 \ n à MvvmCross.Core.ViewModels.MvxViewModelLoader. LoadViewModel (demande MvvmCross.Core.ViewModels.MvxViewModelRequest, MvvmCross.Core.ViewMod els.IMvxBundle savedState) [0x00020] dans C: \ projects \ mvvmcross \ MvvmCross \ Core \ ViewModels \ MvxViewModelLoader.cs: 59 \ n à MvvmCross.Droid.Views.MvxAndroidViewsContainer.ViewModelFromRequest (MvvmCross.Core.ViewModels.MvxViewModelRequest viewModelRequest , MvvmCross.Core.ViewModels.IMvxBundle savedState) [0x00006] dans C: \ projects \ mvvmcross \ MvvmCross \ Droid \ Droid \ Views \ MvxAndroidViewsContainer.cs: 104 \ n à MvvmCross.Droid.Views.MvxAndroidViewsContainer.CreateViewModelFromIntent (Android.Content .Intent intention, MvvmCross.Core.ViewModels.IMvxBundle savedState) [0x00029] dans C: \ projects \ mvvmcross \ MvvmCross \ Droid \ Droid \ Views \ MvxAndroidViewsContainer.cs: 98 \ n à MvvmCross.Droid.Views.MvxAndroidViewsContainer.Load (Android.Content.Intent intention, MvvmCross.Core.ViewModels.IMvxBundle savedState, System.Type viewModelTypeHint) [0x00089] dans C: \ projects \ mvvmcross \ MvvmCross \ Droid \ Droid \ Views \ MvxAndroidViewsContainer.cs: 67 \ n à MvvmCross. Droid.Views.MvxActivityViewExtensions.LoadViewModel (MvvmCross.Dr oid.Views.IMvxAndroidView androidView, MvvmCross.Core.ViewModels.IMvxBundle savedState) [0x00065] dans C: \ projects \ mvvmcross \ MvvmCross \ Droid \ Droid \ Views \ MvxActivityViewExtensions.cs: 137 \ n à MvvmCross.Droid.Views.MvxActivityViewExtensions + <> c__DisplayClass1_0.b__1() [0x00000] dans C: \ projects \ mvvmcross \ MvvmCross \ Droid \ Droid \ Views \ MvxActivityViewExtensions.cs: 50 \ n à MvvmCross.Core.Views.MvxViewExtensionMethods.OnViewCreate (MvvmCross.Core.Views. Vue IMvxView, System.Func 1[TResult] viewModelLoader) [0x00012] in C:\\projects\\mvvmcross\\MvvmCross\\Core\\Core\\Views\\MvxViewExtensionMethods.cs:28 \n at MvvmCross.Droid.Views.MvxActivityViewExtensions.OnViewCreate (MvvmCross.Droid.Views.IMvxAndroidView androidView, Android.OS.Bundle bundle) [0x00068] in C:\\projects\\mvvmcross\\MvvmCross\\Droid\\Droid\\Views\\MvxActivityViewExtensions.cs:50 \n at MvvmCross.Droid.Views.MvxActivityAdapter.EventSourceOnCreateCalled (System.Object sender, MvvmCross.Platform.Core.MvxValueEventArgs 1 [T] eventArgs) [0x00000] dans C: \ projects \ mvvmcross \ MvvmCross \ Droid \ Droid \ Vues \ MvxActivityAdapter.cs: 80 \ n at (wrapper delegate-invoke) System.EventHandler 1[MvvmCross.Platform.Core.MvxValueEventArgs 1 [Android.OS.Bundle]]: invoke_void_object_TEventArgs (objet, MvvmCross.Platform.Core.MvxValueEventArgs 1<Android.OS.Bundle>)\n at MvvmCross.Platform.Core.MvxDelegateExtensionMethods.Raise[T] (System.EventHandler 1 [TEventArgs] eventHandler, expéditeur System.Object, valeur T) [0x00000] dans C: \ projects \ mvvmcross \ MvvmCross \ Platform \ Platform \ Core \ MvxDelegateExtensionMethods.cs: 21 \ n à MvvmCross.Platform.Droid.Views.MvxEventSourceActivity.OnCreate (bundle Android.OS.Bundle) [0x00014] dans C: \ projects \ mvvmcross \ MvvmCross \ Plate-forme \ Droid \ Views \ MvxEventSourceActivity.cs: 34 \ n à MvvmCross.Droid .Views.MvxActivity.OnCreate (ensemble Android.OS.Bundle) [0x00000] dans C: \ projects \ mvvmcross \ MvvmCross \ Droid \ Droid \ Vues \ MvxActivity.cs: 92 \ n à Droid.Views.MainView.OnCreate (Android Bundle .OS.Bundle) [0x00001] dans /Users/jaydeephasmukhlal/Projects/LocationMessengerTest/Droid/Views/MainView.cs:13 \ n sous Android.App.Activity.n_OnCreate_Landroid_os_Bundle_ (System.IntPtr jnienv, System.IntPtr native_this, System .IntPtr native_savedInstanceState) [0x0000f] en: 0 \ n à (wrapper méthode dynamique) System.Object: e63afbc8-7ae5-4091-981d-084af38f92fc (IntPtr, IntPtr, IntPtr) »

Répondre

0

Ok j'ai finalement obtenu l'aide de mon collègue senior et découvert l'erreur stupide que je fait. Ma classe d'interface ILocationService était en fait une classe plutôt qu'une interface.

Exemple le ILocationService était:

public class ILocationService 
{ 
} 

Au lieu de:

public interface ILocationService 
{ 
} 

Par conséquent, changer la classe d'interface résoudre le problème. C'est la raison pour laquelle il n'a pas réussi à initialiser le ILocationService.

1

vous utilisez un type de béton dans votre LocationService constructeur MvxLocationWatcher.Cela devrait être IMvxLocationWatcher et l'IoC injectera la classe concrète basée sur la plate-forme pour vous (N'oubliez pas d'installer le plugin de localisation sur toutes les plates-formes aussi). Vous pouvez consulter MvvmCross Location Plugin docs pour plus d'informations.

ce commutateur:

public LocationService(MvxLocationWatcher locationWatcher, IMvxMessenger messenger) 

à ceci:

public LocationService(IMvxLocationWatcher watcher, IMvxMessenger messenger) 
+0

Je suis conscient de l'installation du plugin à toutes les plates-formes, merci. Je me rends compte de cette erreur, merci de l'avoir signalé. Cependant, cela n'a pas vraiment résolu le problème. Encore recevoir la même erreur. Mise à jour de l'OP avec StackTrace si son aide. –

+0

Hmm, ce que je suggérerais d'essayer, est d'ajouter un point de rupture dans votre constructeur 'LocationService' pour voir s'il est touché et s'il y a des zéros? Juste pour confirmer votre 'LocationService' est un cours public? Comme le casing dans votre question suggère que vous l'avez peut-être ajouté pour stackoverflow mais pas dans votre code. – Plac3Hold3r

+0

Salut désolé pour la réponse tardive. Le constructeur ne semble pas être touché ou nul. L'application plante sur l'activité de la fonction "OnCreate" sur la ligne "base.OnCreate (bundle)". Avec l'erreur étant: "" Impossible de construire et initialiser ViewModel pour le type Core.ViewModels.MainViewModel du localisateur MvxDefaultViewModelLocator ". –