Фильтровать данные перед отправкой подписчику (NServiceBus)

У меня много клиентов, которых нужно уведомлять, когда новые данные добавляются в одну из наших таблиц БД. Я думаю о создании службы, которая проверяет таблицу каждые X секунд и уведомляет клиентов, если существуют какие-либо новые данные. Проблема в том, что каждый клиент имеет разные разрешения и не может видеть всю информацию. Я думал об использовании чего-то вроде NServiceBus для публикации сообщения с новой информацией, но мне нужно отфильтровать информацию в соответствии с разрешениями каждого клиента перед ее отправкой. Фильтрацию необходимо выполнить перед отправкой информации (мне не разрешено выполнять фильтрацию на стороне клиента).

Есть ли встроенная поддержка для этого в NServiceBus?

Если нет, то как я могу достичь этой цели?

EDIT: Вот пример, который я написал в комментарии ниже: скажем, у меня есть библиотека книг. Каждый клиент заинтересован в получении немедленного уведомления о новых книгах, добавленных в библиотеку, но каждому клиенту разрешено получать уведомления только об определенном жанре. Система должна отправить уведомление всем клиентам, содержащим информацию о новых книгах, но каждый клиент должен быть уведомлен только о своем конкретном жанре. Из соображений безопасности я не могу фильтровать данные в клиенте.

Спасибо.


person ItayMaoz    schedule 29.05.2011    source источник
comment
Есть ли группы клиентов, которым интересны аналогичные данные? Или каждый клиент ищет другой набор? Являются ли клиенты и данные частью одного и того же бизнес-компонента (маркетинг и выставление счетов)?   -  person Adam Fyles    schedule 31.05.2011
comment
все клиенты должны получить подмножество данных, добавленных в таблицу, в соответствии с их группой в AD. В остальном разницы между клиентами нет. Я попытаюсь быть более конкретным: каждый объект, который добавляется в таблицу, имеет свойство группы, и каждому клиенту разрешено видеть только некоторые из групп.   -  person ItayMaoz    schedule 01.06.2011
comment
Например: скажем, у меня есть библиотека книг. Каждый клиент заинтересован в получении немедленного уведомления о новых книгах, добавленных в библиотеку, но каждому клиенту разрешено получать уведомления только об определенном жанре. Система должна отправить уведомление всем клиентам, содержащим информацию о новых книгах, но каждый клиент должен быть уведомлен только о своем конкретном жанре. Из соображений безопасности я не могу фильтровать данные в клиенте.   -  person ItayMaoz    schedule 01.06.2011


Ответы (1)


Потенциальным вариантом было бы разрешить только определенным клиентам подписываться на жанры, которые им разрешено просматривать. NSB предоставляет интерфейс IAuthorizeSubscriptions, позволяющий определить, кому разрешено подписываться на сообщение. Разделив сообщения по жанрам, вы можете разрешить/запретить подписку на эти жанры с помощью интерфейса авторизации.

person Adam Fyles    schedule 01.06.2011
comment
Спасибо за комментарий... Я думал об этом варианте, но проблема в том, что жанры динамические и их можно добавлять/удалять на лету. - person ItayMaoz; 01.06.2011
comment
Я думаю, вам придется имитировать функциональность публикации и отправки (Bus.Send()) на основе ваших пользовательских критериев (по сути, инспектора сообщений). Вы можете обернуть это в базовый класс для удобства. - person Adam Fyles; 01.06.2011
comment
Вы должны использовать тот же подход, что и NSB, запросить хранилище (обычно БД с одной таблицей). Все они могут подписаться на одно и то же сообщение, вам просто нужно заранее отфильтровать его. - person Adam Fyles; 02.06.2011
comment
Я понимаю, что вы говорите, но я не могу найти, как запросить хранилище подписчиков (если вы не говорите о запросе без использования фреймворка). Не могли бы вы привести пример кода? - person ItayMaoz; 02.06.2011
comment
Конечно, вы можете использовать фреймворк, просто запросите у контейнера экземпляр ISubscriptionStorage с помощью чего-то вроде s = Bus.Builder.Build‹ISubscriptionStorage›(). Затем вы можете вызвать s.GetSubscribersForMessage()... - person Adam Fyles; 03.06.2011