No more Death March

あるSEのチラシの裏 C# WPF

C# ドメインイベントの実装

こちらの書籍の第8章で紹介されているパターン
通常のイベントハンドラを使わずにクラスをイベントに見立て、クラス間の結合を弱める。

実践ドメイン駆動設計

実践ドメイン駆動設計

偶然なのか、こちらの書籍でも第8章

自分なりに実装

まずIEventインターフェース

namespace Nmdm.Events
{
    public interface IEvent
    {
    }
}

これはイベントである目印をつけるためのマーカー

続いて、ISubscriberインターフェース

namespace Nmdm.Events
{
    public interface ISubscriber
    {
        void Handle(IEvent value);
        bool CanHandle(IEvent value);
    }
}

こちらはIEventを受け取って処理を行うためのインターフェース
HandleメソッドはIEventを引数に処理を行うメソッド、
CanHandleメソッドはIEventを処理できるかどうかを後述のPublisherに伝えるためのメソッド

続いてPublisher、そのままだと長いのでメソッドの中身は後述

using System;
using System.Collections.Generic;
using System.Threading;

namespace Nmdm.Events
{
    public static class Publisher
    {
        private static Mutex Mutex { get; } = new Mutex();
        private static List<WeakReference<ISubscriber>> Subscribers { get; } 
            = new List<WeakReference<ISubscriber>>();
        public static void Publish(IEvent e)
        {
            //省略
        }
        public static void Subscribe(ISubscriber subscriber)
        {
            //省略
        }
        public static void Unsubscribe(ISubscriber subscriber)
        {
            //省略
        }
        private static ISubscriber ToStrong(WeakReference<ISubscriber> obj)
        {
            //省略
        }
    }
}

Publisherクラスは受け取ったIEventをISubscriberに通知するのが役割。
クラスメンバーについて補足:
・Mutex⇒スレッドセーフにするための排他制御
・Subscribers⇒ISubscriberの弱参照リスト、IEventの通知先保存用
・Publish(IEvent e)⇒Subscribersに受け取ったイベントを通知する。
・Subscribe(ISubscriber subscriber)⇒受け取ったサブスクライバを弱参照リストに追加する。
・Unsubscriber(ISubscriber subscriber)⇒受け取ったサブスクライバを弱参照リストから削除する。
・ToStrong(WeakReference obj)⇒弱参照を強参照に変換するメソッド

とりあえず今日はここまで。