メッセージングと匿名

過去の日記で書いたが、拙作のフレームワークではアプリケーション間の簡単なデータ交換に、WM_COPYDATAというWindowsMessageを利用したパブリッシャ/サブスクライバ型の通信フレームワークを提供している。

[.NET][C#]続 NativeWindowクラス (このエントリを書いたときはパブリッシャ/サブスクライバではなく、サーバ/クライアント形式として書いている)

パブリッシャ/サブスクライバは、1:1や1:Nのメッセージングシステムで使われている、非常にポピュラーなメカニズムだ。このメカニズムでは、サブスクライバがメッセージを購読(サブスクライブ)するためにトピックやキューに接続するが、その際にはトピックやキューにつけた名前を使う。一方、パブリッシャはトピックやキューを介して、購読対象になっているサブスクライバ全てにメッセージを発行(パブリッシュ)するが、その際に特定のサブスクライバを知っている必要がない、つまりはサブスクライバは適当な名前、つまり匿名でも良い訳だ。(購読する以上、なんらかの識別でデータを受信しなくてはならないので、名無しでは機能しない)
この匿名というのが厄介で、フレームワーク側で生成したサブスクライバ毎に自動的に振ることが必要なのだが、システムで一意である必要があり、尚且つ簡易に使える文字である必要がある。ちょっと考えたところでは

  • Guid.NewGuid().ToString()を使う
  • object#GetHasCode().ToString()を使う

このどちらかが使えそうだが、Guid.NewGuid()で生成されたGUIDはシステムで確実にユニークになることが保障されるが、そもそもこういうことに使うものではないし大袈裟だ。一方object.GetHasCode()に関しては、全てのオブジェクトで使えるメソッドなので使いやすいが、型によって実装が変わるので必ずしもシステムで一意である保障が無いのが問題。まあ、通常はアプリケーションにつける名前やIDはシステムで一意なので、これでも問題はなさげか。
あとはないかな。

  • Form#Handle.ToString()又はNativeWindows#Handle.ToString()を使う

WM_COPYDATAを利用する、ということはWindowsのhandleを使うということなので、このハンドルを一意な値として利用するという手もある。

う〜ん、どれもいまいちのような。