1

我想滚动我自己的 ViewModelLocator 以在应用程序的中心位置为 ViewModel 创建提供 try/catch/log 包装器,为了能够做到这一点,我必须替换默认的 MvxDefaultViewModelLocator。但我没有找到替代通用方法的方法,只能注入特定于 VM 类型的方法。

我应该如何将自己的 ViewModelLocator 类作为默认类注入?

4

2 回答 2

1

我刚刚重读了你的问题....我回答了一个不同的问题,不是吗?对不起!

让我们再试一次...


默认的 MvxApplication 不提供任何方法来覆盖此成员。如果您认为它对您有用,那么请务必在 GitHub 上提出问题或拉动。

但是,在不更改 Mvx 代码的情况下,实现我认为您正在寻找的效果的一种方法是简单地替换 IoC/ServiceProvider 框架中的 IMvxViewModelLocatorFinder 接口 - 您可以轻松实现:

  public class MyFinder : IMvxViewModelLocatorFinder
  {
        public IMvxViewModelLocator FindLocator(MvxShowViewModelRequest request)
       {

            return new MyDefaultViewModelLocator();
       }
  }

然后您可以在InitializeLastChance每个客户端项目的安装部分中注入这个(覆盖 IoC 中的应用程序条目)?


或者,如果你愿意,你可以走得更高——你可以替换 IMvxViewModelLoader

于 2012-05-02T10:53:28.373 回答
0

这很简单……但实际上在任何样本中都没有!

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 构造中完成。

于 2012-05-02T10:32:39.507 回答