我制作了一个使用IMvxViewModelLoader
的自定义Android视图演示器。在将MvvmCross从5.7版本更新到6.2.2之前,我曾经获得过一个
IMvxViewModelLoader
通过依赖项注入:
public class CustomPresenter : MvxAndroidViewPresenter
{
private readonly IMvxViewModelLoader _viewModelLoader;
private readonly IFragmentTypeLookup _fragmentTypeLookup;
private Android.Support.V4.App.FragmentManager _fragmentManager;
public CustomPresenter(IMvxViewModelLoader viewModelLoader, IFragmentTypeLookup fragmentTypeLookup) : base(new List<Assembly>())
{
_fragmentTypeLookup = fragmentTypeLookup;
_viewModelLoader = viewModelLoader;
}
// Other code
}
在从Setup
继承的MvxAndroidSetup
类中,我重写了IMvxAndroidViewPresenter CreateViewPresenter()
方法:
public class Setup : MvxAndroidSetup
{
protected override IMvxApplication CreateApp()
{
return new App();
}
protected override IMvxTrace CreateDebugTrace()
{
return new DebugTrace();
}
protected override void InitializeIoC()
{
base.InitializeIoC();
Mvx.RegisterSingleton<IFragmentTypeLookup>(new FragmentTypeLookup());
Mvx.RegisterSingleton<IFileLocationService>(new FileLocationService());
Mvx.RegisterSingleton<ISQLitePlatform>(new SQLitePlatformAndroid());
}
protected override IMvxAndroidViewPresenter CreateViewPresenter()
{
var presenter = Mvx.IocConstruct<CustomPresenter>();
Mvx.RegisterSingleton<IMvxAndroidViewPresenter>(presenter);
return presenter;
}
// Other code
}
随着更新,必须对protected override IMvxAndroidViewPresenter CreateViewPresenter()
方法进行一些更改,因此我将其更改为:
protected override IMvxAndroidViewPresenter CreateViewPresenter()
{
var presenter = Mvx.IoCProvider.IoCConstruct<CustomPresenter>();
Mvx.IoCProvider.RegisterSingleton<IMvxAndroidViewPresenter>(presenter);
return presenter;
}
现在运行该应用程序将在CustomPresenter
的构造函数中引发一个异常,该异常指示无法解析IMvxViewModelLoader
实例。我没有在任何地方注册它,但是我假设MvvmCross为我做了这个,因为我在更新之前没有在任何地方注册它。更具体地说,当我打电话给base.InitializeIoC();
时,我以为MvvmCross为我做到了。
我还尝试通过将IMvxViewModelLoader
构造函数更改为以下内容来检索CustomPresenter
的实例:
public CustomPresenter() : base(new List<Assembly>())
{
_fragmentTypeLookup = Mvx.IoCProvider.Resolve<IFragmentTypeLookup>();
_viewModelLoader = Mvx.IoCProvider.Resolve<IMvxViewModelLoader>();
}
但结果相同。
我未通过更新文档Upgrade from 5 to MvvmCross 6搜索线索。
答案 0 :(得分:1)
IMvxViewModelLoader
。这就是为什么在IoC构造演示者或尝试解析演示者时遇到解决问题的原因。
您可以做的是将其延迟加载或,或者IoC通知IMvxViewModelLoader
已加载到IoC中。
在第一种情况下,您可以简单地在演示者中创建一个属性,使用该属性时会检查是否为空:
private IMvxViewModelLoader _viewModelLoader;
private IMvxViewModelLoader ViewModelLoader
{
get
{
if (_viewModelLoader == null)
_viewModelLoader = Mvx.IoCProvider.Resolve<IMvxViewModelLoader>();
return _viewModelLoader;
}
}
用于在注册IMvxViewModelLoader
时回叫:
Mvx.IoCProvider.CallbackWhenRegistered<IMvxViewModelLoader>(loader =>
{
// do your stuff here when it loads
});