2017-08-10 42 views
0

所以我還是MVVM(MvvmCross)/ Android的新手。所以如果我正在做一些非常愚蠢的事情,請道歉。如何使用IoC構造函數注入(MvvmCross(MvvmCross.Platform.Exceptions.MvxIoCResolveException))

我一直在追蹤Stuart Lodge在Nv 9視頻上的「MvxGeoLocation」和「IMvxMessenger」,我確信我一直在追隨它完美,但我不知道我要出錯的地方。

但是我的應用程序無法解析構造函數的接口。

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; } 
} 

現在ILocationService接口是空的。由於IoC的原因,它在那裏。現在,當我運行該應用程序時,它在「base.OnCreate(bundle);」的MainView Activity上崩潰。

現在在重寫InitializeIoC方法,我什至不能做「Mvx.RegisterSingleton(new LocationService());」因爲我需要給出我顯然不能做的論據。我甚至試圖使用「Mvx.IocConstruct();」,但我意識到這將無法正常工作,因爲MvvmCross會自動執行此操作。


所以錯誤消息

無法構造和定位MvxDefaultViewModelLocator初始化視圖模型類型Core.ViewModels.MainViewModel - 檢查的InnerException獲取更多信息

的InnerException

{MvvmCross.Platform.Exceptions.MvxException:問題創造型的視圖模型MainViewModel ---> MvvmCross.Platform.Exceptions.MvxIoCResolveException:未能解決在MvvmCross創建Core.ViewModels.MainViewModel 當類型ILocationService的參數locationService參數MvvmCross.Platform中的C:\ projects \ mvvmcross \ MvvmCross \ Platform \ Platform \ IoC \ MvxSimpleIoCContainer.cs中的.Platform.IoC.MvxSimpleIoCContainer.GetIoCParameterValues(System.Type類型,System.Reflection.ConstructorInfo firstConstructor)[0x00036]:502 MvvmCross.Platform.Mvx.IocConstruct(System.Type t)中的.IoC.MvxSimpleIoCContainer.IoCConstruct(System.Type類型)[0x0002c]位於C:\ projects \ mvvmcross \ MvvmCross \ Platform \ Platform \ IoC \ MvxSimpleIoCContainer.cs中:312 )C:\ projects \ mvvmcross \ MvvmCross \ Platform \ Platform \ Mvx.cs中的[0x00006]:1在C:\ projects \ mvvmcross \ MvvmCross \ Core中的[0x00000]中的MvvmCross.Core.ViewModels.MvxDefaultViewModelLocator.Load(System.Type viewModelType,MvvmCross.Core.ViewModels.IMvxBundle parameterValues,MvvmCross.Core.ViewModels.IMvxBundle savedState)上的69 \ Core \ ViewModels \ MvxDefaultViewModelLocator.cs:33 ---內部異常堆棧跟蹤結束--- at MvvmCross.Core.ViewModels.MvxDefaultViewModelLocator.Load(System.Type viewModelType,MvvmCross.Core.ViewModels.IMvxCundle parameterValues,MvvmCross .Core.ViewModels。IMvxBundle savedState)[0x0000f]位於MvvmCross.Core.ViewModels.MvxViewModelLoader.LoadViewModel(MvvmCross.Core.ViewModels.MvxViewModelRequest請求,MvvmCross。)中的C:\ projects \ mvvmcross \ MvvmCross \ Core \ Core \ ViewModels \ MvxDefaultViewModelLocator.cs:37 。 Core.ViewModels.IMvxBundle savedState,MvvmCross.Core.ViewModels.IMvxViewModelLocator viewModelLocator)[0x0000e]在C:\項目\ mvvmcross \ MvvmCross \核心\核心\的ViewModels \ MvxViewModelLoader.cs:69}

能提供堆棧跟蹤如果需要的話。 那我究竟做錯了什麼?我花了很多時間試圖弄清楚這一點。沒有線索。

更新:

添加堆棧跟蹤(櫃面這是有幫助的):

「在MvvmCross.Core.ViewModels.MvxViewModelLoader.LoadViewModel(MvvmCross.Core.ViewModels.MvxViewModelRequest要求,MvvmCross.Core .MvvmCross.Core.ViewModels.MvxViewModelLoader中的C:\ projects \ mvvmcross \ MvvmCross \ Core \ Core \ ViewModels \ MvxViewModelLoader.cs:73 \ n中的.ViewModels.IMvxBundle savedState,MvvmCross.Core.ViewModels.IMvxViewModelLocator viewModelLocator)[0x00020]。 LoadViewModel(MvvmCross.Core.ViewModels.MvxViewModelRequest請求,MvvmCross.Core.ViewMod在MvvmCross.Droid.Views.MvxAndroidViewsContainer.ViewModelFromRequest(MvvmCross.Core.ViewModels.MvxViewModelRequest viewModelRequest)中的C:\ projects \ mvvmcross \ MvvmCross \ Core \ Core \ ViewModels \ MvxViewModelLoader.cs:59 \ n中的els.IMvxBundle savedState)[0x00020] ,MvvmCross.Core.ViewModels.IMvxBundle savedState)[0x00006]在C:\ projects \ mvvmcross \ MvvmCross \ Droid \ Droid \ Views \ MvxAndroidViewsContainer.cs:104 \ n在MvvmCross.Droid.Views.MvxAndroidViewsContainer.CreateViewModelFromIntent(Android.Content .Intent intent,MvvmCross.Core.ViewModels.IMvxBundle savedState)[0x00029] in C:\ projects \ mvvmcross \ MvvmCross \ Droid \ Droid \ Views \ MvxAndroidViewsContainer.cs:98 \ n在MvvmCross.Droid.Views.MvxAndroidViewsContainer.Load( Android.Content.Intent intent,MvvmCross.Core.ViewModels.IMvxBundle savedState,System.Type viewModelTypeHint)在C:\ projects \ mvvmcross \ MvvmCross \ Droid \ Droid \ Views \ MvxAndroidViewsContainer.cs中的[0x00089]:MvvmCross上的67 \ n。 Droid.Views.MvxActivityViewExtensions.LoadViewModel(MvvmCross.Dr在MvvmCross.Droid.Views.MvxActivityViewExtensions + C:\ projects \ mvvmcross \ MvvmCross \ Droid \ Droid \ Views \ MvxActivityViewExtensions.cs中的[0x00065]:oid.Views.IMvxAndroidView androidView,MvvmCross.Core.ViewModels.IMvxBundle savedState)在MvvmCross.Core.Views.MvxViewExtensionMethods.OnViewCreate(MvvmCross.Core.Views。)中的C:\ projects \ mvvmcross \ MvvmCross \ Droid \ Droid \ Views \ MvxActivityViewExtensions.cs:50 \ n中的c__DisplayClass1_0.b__1()[0x00000] 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]在C:\ projects \ mvvmcross \ MvvmCross \ Droid \ Droid \ Views \ MvxActivityAdapter.cs中:80 \ n at(wrapper delegate-invoke)System.EventHandler 1[MvvmCross.Platform.Core.MvxValueEventArgs 1 [Android.OS.Bundle]]:invoke_void_object_TEventArgs(object,MvvmCross.Platform.Core.MvxValueEventArgs 1<Android.OS.Bundle>)\n at MvvmCross.Platform.Core.MvxDelegateExtensionMethods.Raise[T] (System.EventHandler 1 [TEventArgs] eventHandler,System.Object sender,T value)[0x00000]位於C:\ projects \ mvvmcross \ MvvmCross \ Platform \ Platform \ Core \ MvxDelegateExtensionMethods.cs:21 \ n MvvmCross.Player上的MvvmCross.Platform.Droid.Views.MvxEventSourceActivity.OnCreate(Android.OS.Bundle包)在C:\ projects \ mvvmcross \ MvvmCross \ Platform \ Droid \ Views \ MvxEventSourceActivity.cs中爲[0x00014]:34 \ n .Views.MvxActivity.OnCreate(Android.OS.Bundle包)[C:\ projects \ mvvmcross \ MvvmCross \ Droid \ Droid \ Views \ MvxActivity.cs中的[0x00000]:Droid.Views.MainView.OnCreate(Android .OS.Bundle包)[0x00001]位於/Users/jaydeephasmukhlal/Projects/LocationMessengerTest/Droid/Views/MainView.cs:13/n at Android.App.Activity.n_OnCreate_Landroid_os_Bundle_(System.IntPtr jnienv,System.IntPtr native__this,System .IntPtr native_savedInstanceState)[0x0000f]在:0 \ n在(包裝紙動態方法)System.Object的:e63afbc8-7ae5-4091-981d-084af38f92fc(IntPtr的,IntPtr的,IntPtr的)」

回答

0

好吧,我終於得到了從我的資深同事的幫助,發現了愚蠢的錯誤我犯了。我的界面類ILocationService實際上是一個類而不是一個接口。

實施例的ILocationService是:

public class ILocationService 
{ 
} 

代替:

public interface ILocationService 
{ 
} 

因此,改變類接口解決了這個問題。這是它未能初始化ILocationService的原因。

1

正在使用的在你的012中的具體類型構造函數MvxLocationWatcher。這應該是IMvxLocationWatcher,然後IoC將爲您注入基於平臺的具體類(請記住在所有平臺中安裝位置插件)。您可以查看MvvmCross Location Plugin docs瞭解更多信息。

開關這樣的:

public LocationService(MvxLocationWatcher locationWatcher, IMvxMessenger messenger) 

這樣:

public LocationService(IMvxLocationWatcher watcher, IMvxMessenger messenger) 
+0

我知道安裝插件到所有平臺,謝謝。我意識到我犯的這個錯誤,謝謝你指出了這一點。但是,這並沒有解決問題。仍然收到相同的錯誤。如果有任何幫助,用StackTrace更新OP。 –

+0

嗯,我會建議嘗試,是添加一個斷點到你的'LocationService'構造函數,看它是否被擊中,如果有任何空值?只是爲了確認你的'LocationService'是一個公共類?由於你的問題中的外殼建議你可能已經將它添加到了stackoverflow中,但不是在你的代碼中。 – Plac3Hold3r

+0

嗨,對不起,遲交回復。該構造函數似乎沒有命中或爲空。應用程序崩潰在行「base.OnCreate(bundle)」上的「OnCreate」函數中的活動。 「」無法從Locator MvxDefaultViewModelLocator中爲類型Core.ViewModels.MainViewModel構造和初始化ViewModel「 –

相關問題