2

複合アプリケーションの概念を学んでいます。Unityコンテナを使用してプリズムアプリケーションを作成しました。コンテンツコントロールとして構成されたリージョンの1つ-このリージョンでは、単一のビューのみを表示したいと思います。

私は次の方法でビューインジェクションを使用しています:

object lastView;

    // View injection
    IRegion region = regionManager.Regions["MainRegion"];

    var ordersView = container.Resolve<OrdersView>();
    lastView = ordersView;
    region.Add(ordersView, "OrdersView");
    region.Activate(ordersView);

この地域のビューは頻繁に切り替えられます。region.remove(lastView) 上記のコードのような次のビューを使用して追加する前に、ビューを切り替えます。

実装が適切かどうかわからないので、いくつか質問があります。region.removeメソッドを使用している場合、削除されたビューは破棄されますか?長い目で見れば、深刻なメモリリークが発生するからです。メモリリークを回避しながら、リージョンに単一のビューを実装するための最良の方法は何ですか?

ありがとう

4

1 に答える 1

4

メモリリークによって、ガベージコレクターがそのビューを収集するかどうかについて話していると思います。たとえば、コンテナーを削除しても、コンテナーはそれを参照し続けます。

解決後にオブジェクトの参照を保持するかどうかの決定は、そのオブジェクトを登録したときに使用したLifeTimeManagerのタイプに基づいています。

質問に簡単に答えるには-で使用されるデフォルトのLifeTimeマネージャーRegisterTypeTransientLifetimeManagerであり、UnityはResolveまたはResolveAllメソッドの呼び出しごとに要求されたタイプの新しいインスタンスを作成します。

あなたがおそらく探しているのはExternallyControlledLifetimeManagerです:

このライフタイムマネージャーを使用すると、タイプマッピングと既存のオブジェクトをコンテナーに登録できるため、ResolveまたはResolveAllメソッドを呼び出したとき、または依存関係メカニズムが属性に基づいて他のクラスにインスタンスを挿入したときに、作成したオブジェクトへの弱い参照のみを維持します。そのクラス内のコンストラクターパラメーター。これにより、他のコードがオブジェクトをメモリ内に維持または破棄できるようになり、既存のオブジェクトの存続期間の制御を維持したり、他のメカニズムで存続期間を制御したりできるようになります。

ビューの存続期間を制御する場合はRegisterType、このLifeTimeManagerでの使用を検討してください。

また、この記事によると、解決されたインスタンスでDisposeを呼び出すライフタイムマネージャーは、ContainerControlledLifetimeManager(単一のインスタンスを作成する)とHierarchicalLifetimeManagerのみです。このような場合、Disposeライフタイムマネージャーが破棄されたときにのみ呼び出されます。

于 2012-12-13T08:33:26.367 に答える