Отключение регистрации событий и подписки - PullRequest
0 голосов
/ 09 ноября 2010

Издатель выставляет событие, к которому могут подключиться несколько подписчиков

на стороне подписчика -> publisher.OnSomeEvent + = subscriber.CallMe ()

Позже подписчик подписывается на основании некоторых динамических аргументов

издатель. Подписка (аргументы)

publisher.Unsubscribe (аргументы)

В зависимости от того, какие аргументы передает подписчик, я хочу, чтобы издатель обновлял подписчиков для контента, на который они подписаны.

Внутренне я могу поддерживать карту подписчика с аргументами, но моя проблема в том, что, поскольку регистрация событий и подписка отключены, я не могу найти хороший способ передать дескриптор вызываемого абонента (поэтому я могу поддерживать карту подписчик-> аргументы) при звонке Подписаться / отписаться от звонка.

Чтобы сохранить мой API простым, я не хочу, чтобы вызываемый абонент передавал "this", также, поскольку StackFrame и диагностический API не работают в режиме выпуска из-за проблем с встраиванием, я не могу придумать лучший дизайн.

Цените вашу помощь, если вы можете предложить лучший способ достичь этого?

Ответы [ 2 ]

0 голосов
/ 09 ноября 2010

Если вы хотите отфильтровать публикации, я говорю, что отбрасываю событие и вместо этого использую что-то вроде

publisher.Subscribe(arguments, subscriber.CallMe)

Чтобы отписаться, у вас должен быть какой-то идентификатор, например GUID, string, int, this (не уверен, почему вы хотите этого избежать) ...

0 голосов
/ 09 ноября 2010

Это не самое элегантное решение, но вы могли бы договориться с подписчиком об издателе через интерфейс, который избавит издателя от необходимости знать о какой-либо конкретной реализации подписчика.

Например

interface ISubscriber
{
object Arguments{get;}
}

Что бы сделать подпись API клиента:

void Subscribe(ISubscriber subscriber)

Конечно, вы можете захотеть реализовать интерфейс на отдельном типе, если вы не хотите, чтобы ваши типы подписчиков имели свойство Arguments.

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