2

IMvxAndroidCurrentTopActivityMvvmCross Android アプリケーションで現在のトップ アクティビティを取得するために使用できます。

問題は、トップ アクティビティが変更されるとすぐに MvvmCross がこのインターフェイスの新しいインスタンスを作成するか、それとも同じインスタンスを再利用してActivityプロパティを変更するだけかということです。

背景: シングルトンとして登録されているクラスで、そのインターフェイスをコンストラクターの依存関係として使用したいと考えています。
それはうまくいきますか?

4

1 に答える 1

9

デフォルトの MvvmCross セットアップでは、そのインターフェースはシングルトンとして実装されているため、アプリがメモリ内にある限り、同じインスタンスを返すことが保証されています

https://github.com/slodge/MvvmCross/blob/v3/Cirrious/Cirrious.MvvmCross.Droid/Platform/MvxAndroidSetup.cs#L76を参照InitializePlatformServicesして ください。

    protected override void InitializePlatformServices()
    {
        var lifetimeMonitor = new MvxAndroidLifetimeMonitor();
        Mvx.RegisterSingleton<IMvxAndroidActivityLifetimeListener>(lifetimeMonitor);
        Mvx.RegisterSingleton<IMvxAndroidCurrentTopActivity>(lifetimeMonitor);
        Mvx.RegisterSingleton<IMvxLifetime>(lifetimeMonitor);

        Mvx.RegisterSingleton<IMvxAndroidGlobals>(this);

        var intentResultRouter = new MvxIntentResultSink();
        Mvx.RegisterSingleton<IMvxIntentResultSink>(intentResultRouter);
        Mvx.RegisterSingleton<IMvxIntentResultSource>(intentResultRouter);

        var viewModelTemporaryCache = new MvxSingleViewModelCache();
        Mvx.RegisterSingleton<IMvxSingleViewModelCache>(viewModelTemporaryCache);
    }

このシングルトンの性質は、実際にはこのインターフェイスの定義の一部です。そのため、Android のセットアップをオーバーライドする場合は、この登録をシングルトンとして保持する必要があります。


一般的なレベルでは、インターフェイスまたはオブジェクトがシングルトンとして登録されているか、動的なオンデマンド作成オブジェクトとして登録されているかを MvvmCross で現在確認する唯一の方法があると思います-ソースを確認する

将来的には、これは XML コメントまたは何らかの命名規則を介して実現される可能性がありますが、現在これらが計画されているとは思えませんし、これらの手法のいずれもコンパイル時にチェックされることはありません。

于 2013-07-04T09:36:58.517 に答える