弱いイベントパターンを用いたリスナー登録機能を持つビューモデルベース

WeakEventViewModelBase クラスの実装を見直しました(2020年5月27日)。

サービス層からのプロパティ変更のイベント通知を受け取るビューモデルが必要になったので、以前書いたビューモデルベースを基に弱いイベントパターンを用いたリスナー登録機能を持つビューモデルベースを書いてみました。サービス層からのイベント通知をビューモデルが受け取るということは、サービス層がイベントソース、ビューモデルがイベントリスナになりますが、複数のウィンドウがあるアプリケーションの場合、サービス層(イベントソース)よりもビューモデル(イベントリスナ)のほうが有効期間が短い場合、ビューモデルを破棄しようとしてもサービス層からの強い参照が残っているため、破棄することができません(メモリリーク)。この問題への対応策として弱いイベントパターンがあり、今回はサービス層とビューモデルの間を弱いイベントパターンで結びつけます。なお、メモリリークになるのは、サービス層(イベントソース)よりもビューモデル(イベントリスナ)のほうが有効期間が短い場合なので、サービス層からのイベント通知を受け取るビューモデルの破棄とサービス層の破棄が同じタイミングになる場合には、メモリリークにはなりません。

(2013/12/29 追記)
ソースコードのダウンロードページを作成しました。

WeakEventViewModelBase クラスは、ViewModel クラスから派生させ、IWeakEventListener インターフェイスを実装します。


using System;
using System.Windows;

namespace MakCraft.ViewModels
{
    /// <summary>
    /// IWeakEventListener インターフェイスを実装したビューモデルベースです。
    /// </summary>
    public abstract class WeakEventViewModelBase : ViewModelBase, IWeakEventListener
    {
        /// <summary>
        /// コンストラクタ
        /// </summary>
        public WeakEventViewModelBase() { }

        #region IWeakEventListener

        /// <summary>
        /// イベント マネージャーからイベントを受信します。
        /// </summary>
        /// <param name="managerType"></param>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        /// <returns></returns>
        public bool ReceiveWeakEvent(Type managerType, object sender, EventArgs e)
        {
            // PropertyChangedEvent を受信したときの処理を行う。
            OnReceivedPropertyChangeNotification(managerType, sender, e);

            return true;
        }

        /// <summary>
        /// PropertyChangedEvent を受信したときに実行する仮想メソッドです。
        /// </summary>
        /// <param name="managerType"></param>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        protected virtual void OnReceivedPropertyChangeNotification(Type managerType, object sender, EventArgs e) { }

        #endregion
    }
}

次は、このビューモデルベースを用いた簡単なプログラムを掲載しようと思います。

もうひとつ、2画面を持つプログラムでイベントリスナーがイベントソースより先に破棄される状況(通常のイベント通知登録では、メモリリークとなる)で、イベントリスナーが問題なく破棄されることを確認する記事も参考にどうぞ。


弱いイベントパターンを用いたリスナー登録機能を持つビューモデルベース」への2件のフィードバック

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です