我想滚动我自己的 ViewModelLocator 以在应用程序的中心位置为 ViewModel 创建提供 try/catch/log 包装器,为了能够做到这一点,我必须替换默认的 MvxDefaultViewModelLocator。但我没有找到替代通用方法的方法,只能注入特定于 VM 类型的方法。
我应该如何将自己的 ViewModelLocator 类作为默认类注入?
我想滚动我自己的 ViewModelLocator 以在应用程序的中心位置为 ViewModel 创建提供 try/catch/log 包装器,为了能够做到这一点,我必须替换默认的 MvxDefaultViewModelLocator。但我没有找到替代通用方法的方法,只能注入特定于 VM 类型的方法。
我应该如何将自己的 ViewModelLocator 类作为默认类注入?
我刚刚重读了你的问题....我回答了一个不同的问题,不是吗?对不起!
让我们再试一次...
默认的 MvxApplication 不提供任何方法来覆盖此成员。如果您认为它对您有用,那么请务必在 GitHub 上提出问题或拉动。
但是,在不更改 Mvx 代码的情况下,实现我认为您正在寻找的效果的一种方法是简单地替换 IoC/ServiceProvider 框架中的 IMvxViewModelLocatorFinder 接口 - 您可以轻松实现:
public class MyFinder : IMvxViewModelLocatorFinder
{
public IMvxViewModelLocator FindLocator(MvxShowViewModelRequest request)
{
return new MyDefaultViewModelLocator();
}
}
然后您可以在InitializeLastChance
每个客户端项目的安装部分中注入这个(覆盖 IoC 中的应用程序条目)?
或者,如果你愿意,你可以走得更高——你可以替换 IMvxViewModelLoader
这很简单……但实际上在任何样本中都没有!
ViewModelLocators 的“容器”是MvxApplication对象。默认情况下,它使用基于约定的约定MvxDefaultViewModelLocator
,即尝试通过使用声明的具有字符串参数的构造函数来构造 ViewModel 实例。
如果您想使用自己的 ViewModel 定位器,那么最简单的方法是从 MvxViewModelLocator 继承并提供返回 ViewModel 实例的公共属性或公共方法:
例如:
public class MyViewModelLocator : MvxViewModelLocator
{
public MyFirstViewModel CreateFirst()
{
return new MyFirstViewModel();
}
public MySecondViewModel CreateSecond(string aParameter)
{
var someLookup1 = ComplicatedStaticThing1.Lookup(aParameter);
var viewModel = new MySecondViewModel(someLookup1);
var someLookup2 = ComplicatedStaticThing2.Lookup(aParameter, someLookup1);
viewModel.DoSomething(someLookup2);
return viewModel;
}
private readonly MyThirdViewModel _third = new MyThirdViewModel();
public MyThirdViewModel Third
{
get
{
return _third;
}
}
}
如果你想比这更低,那么你也可以直接实现 IMvxViewModelLocator。
要将 ViewModelLocator 添加到应用程序,只需实例化并将其添加到您的应用程序中 - 例如:
public class App
: MvxApplication
, IMvxServiceProducer<IMvxStartNavigation>
{
public App()
{
this.RegisterServiceInstance<IMvxStartNavigation>(new StartApplicationObject());
base.AddLocator(new MyViewModelLocator());
// to disable the default ViewModelLocator, use:
// base.UseDefaultViewModelLocator = false;
}
}
注意: - 除了设计时数据,我现在很少发现需要实现自定义 ViewModelLocator - 通常我想做的所有事情都可以在 ViewModel 构造中完成。