C# ドメインイベントの実装
こちらの書籍の第8章で紹介されているパターン
通常のイベントハンドラを使わずにクラスをイベントに見立て、クラス間の結合を弱める。
- 作者: ヴァーン・ヴァーノン
- 出版社/メーカー: 翔泳社
- 発売日: 2015/03/19
- メディア: Kindle版
- この商品を含むブログ (2件) を見る
偶然なのか、こちらの書籍でも第8章
.NETのエンタープライズアプリケーションアーキテクチャ第2版 .NETを例にしたアプリケーション設計原則
- 作者: ディノエスポシト,アンドレアサルタレロ
- 出版社/メーカー: 日経BP社
- 発売日: 2015/06/18
- メディア: Kindle版
- この商品を含むブログを見る
自分なりに実装
まず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
とりあえず今日はここまで。