Безопасная тема Опубликовать Подписаться на .Net - PullRequest
0 голосов
/ 17 августа 2010

Я создал простой набор интерфейсов и класс, который позволяет мне публиковать добавления и удаления элементов в универсальном словаре.Подписчики получают весь список, когда подписываются, и после этого они получают только изменения.

Хотя мои решения работают, я ищу что-то более стандартное, немного менее домашнее.Есть ли у вас какие-либо предложения?

Заметки о том, что я нашел до сих пор:

Я смотрел на Reactive Extensions (Rx) от Microsoft.Согласно статье Джона Скита «LINQ to Rx: вторые впечатления» [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/

1 Ответ

1 голос
/ 17 августа 2010

Это не совсем ответ, но утомительно вкладывать его в комментарии, поэтому помещайте его здесь ... Не уверен, почему вы смотрите на стандартное готовое решение, когда ваше пользовательское решение легко построитьи будет работать?События - это самый простой (и стандартный) способ достижения модели издатель-подписчик, но они не являются поточно-ориентированными и страдают от жесткой связи между подписчиком и издателем.Группа шаблонов и практики MS опубликовала WCF-шаблон pattern , но я думаю, что вы ищете быстрый внутрипроцессный код.Точно так же многие другие стандартные решения публикации-подписки будут нацелены на интеграцию приложений (ESB).Если вы не нашли альтернативы и решили использовать свое собственное решение, вы можете обратиться к этому artcile , в котором описаны проблемы при реализации этого шаблона проектирования.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...