Должен ли я использовать темы и фильтры? Не уверен, что это лучшие практики.
Да. Это классический вариант использования c для тем и подписок.
Если да, существует ли способ отправить сообщение правильной подписке? Например, я публикую sh сообщение для подписки X вместо публикации для всех подписок.
Способ публикации заключается в том, что вы публикуете sh в topi c, topi c принимает сообщения и проверяет фильтры по всем подпискам. Подписки с удовлетворяющими критериями фильтра получают сообщение. Подписки, не удовлетворяющие критериям фильтра, пропускаются. Существует три типа фильтров: Boolean, SQL и Correlation. Булевы фильтры менее актуальны для вас. Корреляционные или SQL фильтры сделают эту работу. Вы можете найти более подробную информацию о фильтрах в моем посте .
. Я бы предложил здесь "поставить отметку" в каждом сообщении методом уведомления. Поскольку вы собираетесь использовать один метод уведомления для каждого метода, корреляционный фильтр будет самым простым и эффективным. Значение метода уведомления может быть присвоено системному свойству Label
исходящих сообщений и корреляционному фильтру в обеих подписках (одна для службы электронной почты и одна для служб уведомлений pu sh). Например (псевдокод):
var message = new Message();
// custom logic to determine what notification method to use
if (notificationMethod == NotificationMethod.Email)
{
message.Label = "email";
}
else
{
message.Label = "push";
}
// publish the message to the topic
И настройки двух фильтров будут следующими:
// email notification service subscription
var emailFilter = new CorrelationFilter();
filter.Label = "email";
// push notifications service subscription
var pushFilter = new new CorrelationFilter();
filter.Label = "push";
Создание подписки с данным фильтром (например, по электронной почте):
var management = new ManagementClient(...);
await management.CreateSubscriptionAsync(new SubscriptionDescription("topic", "subscription"));
var client = new SubscriptionClient("topic", "subscription");
await client.AddRuleAsync(new RuleDescription(
{
Filter = emailFilter,
Name = "email filter"
}));