私は、任意のクライアントが特定のタイプのイベントにサブスクライブできるようにする非常に単純なイベント バスを作成したいと考えています。パブリッシャーがEventBus.PushEvent()
メソッドを使用してバスにイベントをプッシュすると、その特定のイベント タイプにサブスクライブしたクライアントのみがイベントを取得します。
C# と .NET 2.0 を使用しています。
Tiny Messenger は良い選択です。ライブ プロジェクトで 2 年半使用しています。Wiki からのいくつかのコード例 (以下のリンク):
出版
messageHub.Publish(new MyMessage());
購読中
messageHub.Subscribe<MyMessage>((m) => { MessageBox.Show("Message Received!"); });
messageHub.Subscribe<MyMessageAgain>((m) => { MessageBox.Show("Message Received!"); }, (m) => m.Content == "Testing");
コードは GitHub にあります: https://github.com/grumpydev/TinyMessenger
Wiki はこちら: https://github.com/grumpydev/TinyMessenger/wiki
Nugetパッケージもあります
Install-Package TinyMessenger
GenericMessageBusを見つけました。シンプルなクラスのひとつです。
Composite Application Blockには、役に立つイベント ブローカーが含まれています。
Unity 拡張機能もチェックしてください: http://msdn.microsoft.com/en-us/library/cc440958.aspx
[Publishes("TimerTick")]
public event EventHandler Expired;
private void OnTick(Object sender, EventArgs e)
{
timer.Stop();
OnExpired(this);
}
[SubscribesTo("TimerTick")]
public void OnTimerExpired(Object sender, EventArgs e)
{
EventHandler handlers = ChangeLight;
if(handlers != null)
{
handlers(this, EventArgs.Empty);
}
currentLight = ( currentLight + 1 ) % 3;
timer.Duration = lightTimes[currentLight];
timer.Start();
}
より良いものはありますか?
別の優れた実装は次の場所にあります。
http://code.google.com/p/fracture/source/browse/trunk/Squared/Util/EventBus.cs
ユースケースには、/ trunk / Squared / Util / UtilTests / Tests/EventTests.csからアクセスできます。
この実装には外部ライブラリは必要ありません。
改善点は、文字列ではなくタイプでサブスクライブできるようになることです。
私はこれを作成しました:
https://github.com/RemiBou/RemiDDD/tree/master/RemiDDD.Framework/Cqrs
ninjectには依存関係があります。あなたはMessageProcessorを手に入れました。イベントを監視したい場合、コマンドを処理したい場合は「IObserver」を実装します「ICommandHandleer」を実装します
Hibernating Rhinosのエピソード 3 、Ayende のスクリーン キャスト シリーズ「Implementing the event broker」をチェックしてください。
Windsor を使用して非常に単純なイベント ブローカーを実装し、接続する方法を示します。ソースコードも同梱。
提案されたイベント ブローカ ソリューションは非常に単純ですが、イベントとともに引数を渡せるようにソリューションを拡張するのにそれほど時間はかかりません。