更新到 MvvmCross 6.2.2 后无法解析自定义 Android ViewPresenter 中的 IMvxViewModelLoader 实例
Unable to resolve instance of IMvxViewModelLoader in custom Android ViewPresenter after updating to MvvmCross 6.2.2
我制作了一个使用 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
}
在继承自 MvxAndroidSetup
的 Setup
class 中,我覆盖了 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 为我做了这件事,因为我在更新之前没有在任何地方注册它。更具体地说,我认为 MvvmCross 在我调用 base.InitializeIoC();
.
时为我做了这件事
我还尝试通过将 CustomPresenter
构造函数更改为:
来检索 IMvxViewModelLoader
的实例
public CustomPresenter() : base(new List<Assembly>())
{
_fragmentTypeLookup = Mvx.IoCProvider.Resolve<IFragmentTypeLookup>();
_viewModelLoader = Mvx.IoCProvider.Resolve<IMvxViewModelLoader>();
}
但结果是一样的
我通过更新文档搜索线索失败:Upgrade from 5 to MvvmCross 6。
IMvxViewModelLoader
是在presenter创建后创建的。这就是为什么在 IoC 构建演示者或尝试在其构造函数中解决时遇到解决问题的原因。
你可以做的是延迟加载它或者 得到 IoC 的通知,IMvxViewModelLoader
已经加载到 IoC 中。
在第一种情况下,您可以简单地在演示者中创建一个 属性,它会在您使用它时检查是否为 null:
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
});
我制作了一个使用 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
}
在继承自 MvxAndroidSetup
的 Setup
class 中,我覆盖了 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 为我做了这件事,因为我在更新之前没有在任何地方注册它。更具体地说,我认为 MvvmCross 在我调用 base.InitializeIoC();
.
我还尝试通过将 CustomPresenter
构造函数更改为:
IMvxViewModelLoader
的实例
public CustomPresenter() : base(new List<Assembly>())
{
_fragmentTypeLookup = Mvx.IoCProvider.Resolve<IFragmentTypeLookup>();
_viewModelLoader = Mvx.IoCProvider.Resolve<IMvxViewModelLoader>();
}
但结果是一样的
我通过更新文档搜索线索失败:Upgrade from 5 to MvvmCross 6。
IMvxViewModelLoader
是在presenter创建后创建的。这就是为什么在 IoC 构建演示者或尝试在其构造函数中解决时遇到解决问题的原因。
你可以做的是延迟加载它或者 得到 IoC 的通知,IMvxViewModelLoader
已经加载到 IoC 中。
在第一种情况下,您可以简单地在演示者中创建一个 属性,它会在您使用它时检查是否为 null:
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
});