1

アプリケーション内の中央の場所で ViewModel を作成するための try/catch/log ラッパーを提供するために、独自の ViewModelLocator をロールバックしたいと考えています。これを行うには、デフォルトの MvxDefaultViewModelLocator を置き換える必要があります。しかし、一般的なものを置き換える方法は見つかりませんでした。VM タイプ固有のものを挿入するだけでした。

独自の ViewModelLocator クラスをデフォルトのクラスとして挿入するにはどうすればよいですか?

4

2 に答える 2

1

私はちょうどあなたの質問を読み直しました....そして私は別のものに答えましたよね?ごめん!

もう一度試してみましょう...


既定の MvxApplication は、このメンバーをオーバーライドする方法を提供しません。役立つと思われる場合は、GitHub で問題を提起するかプルしてください。

ただし、Mvx コードを変更せずに、IoC/ServiceProvider フレームワークの IMvxViewModelLocatorFinder インターフェイスを単に置き換えるだけで、あなたが探している効果を実現する 1 つの方法があります。簡単に実装できます。

  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 に答える