2017-08-10 59 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“ –