単純なインターフェイスのセットと、アイテムの追加と削除を汎用ディクショナリに公開できるクラスを作成しました。サブスクライバーは、サブスクライブ時にリスト全体を受け取り、その後は変更のみを受け取ります。
私のソリューションは機能しますが、もう少し標準的なもの、もう少し自家製のものを探しています。何か提案はありますか?
私がこれまでに見つけたものに関するメモ:
私はMicrosoftのReactiveExtensions(Rx)を見てきました。JonSkeetの記事「LINQtoRx:secondimpressions」[1]によると、「オブザーバブルがサブスクライブするとすぐに、オブザーバブルはシーケンス内のすべてを(デフォルトでは別のスレッドで)公開します。サブスクライブへの個別の呼び出しオブザーバブルをシーケンス全体で複数回繰り返すようにします。」これは基本的な考え方のように聞こえますが、具体的な例が見つからず、「Subject」または「AsyncSubject」のスレッドセーフについてはまだよくわかりません。
私の自家製ソリューションに関するメモ:
サブスクライバーに配信される構造は次のようになります。
/// <summary>
/// Interface for a set of changes that are being published.
/// </summary>
/// <typeparam name="TKey"></typeparam>
/// <typeparam name="TItem"></typeparam>
public interface IPublication<TKey, TItem>
{
/// <summary>
/// Version of the list.
/// </summary>
long Version { get; }
/// <summary>
/// Items that were added or updated.
/// </summary>
IEnumerable<TItem> ChangedItems { get; }
/// <summary>
/// Keys to items that were removed.
/// </summary>
IEnumerable<TKey> RemovedKeys { get; }
}
サブスクライバー自身がこのインターフェースを実装する必要があります。
/// <summary>
/// Interface for a subscriber that will receive IPublication{TKey, TItem} deliveries from a publisher.
/// </summary>
/// <typeparam name="TKey"></typeparam>
/// <typeparam name="TItem"></typeparam>
public interface ISubscribe<TKey, TItem>
{
void Deliver(IPublication<TKey, TItem> pub);
}
そしてもちろん、私の汎用辞書パブリッシャークラスには次のメソッドがあります。
/// <summary>
/// Adds the give subscriber to the list of subscribers and immediately publishes the
/// dictionary contents to the new subscriber. The return value may be disposed when
/// the subscriber wishes to terminate it's subscription.
/// </summary>
/// <param name="subscriber"></param>
/// <returns></returns>
public IDisposable Subscribe(ISubscribe<TKey, TItem> subscriber);
[1] https://codeblog.jonskeet.uk/2010/01/19/linq-to-rx-second-impressions/