所以我還是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.EventHandler1[MvvmCross.Platform.Core.MvxValueEventArgs
1 [Android.OS.Bundle]]:invoke_void_object_TEventArgs(object,MvvmCross.Platform.Core.MvxValueEventArgs1<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的)」
我知道安裝插件到所有平臺,謝謝。我意識到我犯的這個錯誤,謝謝你指出了這一點。但是,這並沒有解決問題。仍然收到相同的錯誤。如果有任何幫助,用StackTrace更新OP。 –
嗯,我會建議嘗試,是添加一個斷點到你的'LocationService'構造函數,看它是否被擊中,如果有任何空值?只是爲了確認你的'LocationService'是一個公共類?由於你的問題中的外殼建議你可能已經將它添加到了stackoverflow中,但不是在你的代碼中。 – Plac3Hold3r
嗨,對不起,遲交回復。該構造函數似乎沒有命中或爲空。應用程序崩潰在行「base.OnCreate(bundle)」上的「OnCreate」函數中的活動。 「」無法從Locator MvxDefaultViewModelLocator中爲類型Core.ViewModels.MainViewModel構造和初始化ViewModel「 –