В настоящее время я разрабатываю пример проекта, в котором я использую NServiceBus в фоновом режиме для публикации событий. Предполагается, что серверный сервер будет обрабатывать собственные события через набор обработчиков. Это прекрасно работает, когда я реализую один конкретный обработчик для каждого события, как так:NServicebus Generic MessageHandler не вызывается
public sealed class MyEventHandler : IHandleMessages<MyEvent> { }
public sealed class OtherEventHandler : IHandleMessages<OtherEvent> { }
Однако, поскольку эти обработчики просто направить события в другой процессор, я хотел, чтобы очистить немного и реализовать только один общий обработчик сообщений :
public sealed class GenericHandler : IHandleMessages<object> { }
к сожалению, общий обработчик вызывается только для типов сообщений, для которых другой, конкретный обработчик присутствует в проекте. Другими словами, GenericHandler правильно принимает событие MyEvent, когда я оставляю MyEventHandler в источниках, но перестает получать это сообщение, когда я удаляю этот (теперь устаревший) обработчик. Моя цель состоит в том, чтобы удалить всех конкретных обработчиков из проекта и работать только с одним GenericHandler. Я пропустил базовый шаг в настройке?
NServiceBus-конфигурации выглядит следующим образом:
<UnicastBusConfig>
<MessageEndpointMappings>
<add Assembly="Kingo.Samples.Chess.Api" Endpoint="kingo.samples.chess" />
</MessageEndpointMappings>
</UnicastBusConfig>
Кроме того:
- АНИ-сборка уже упоминалось выше, содержит все события, которые должны быть опубликованы и обработаны.
- Все сообщения отмечены знаками
ICommand
иIEvent
от NServiceBus. - Я использую NServiceBus V5 (Core) в сочетании с NServiceBus.Host V6.
У меня есть следующие пользовательские конфигурации шины в моем EndpointConfig:
void IConfigureThisEndpoint.Customize(BusConfiguration configuration) { configuration.AssembliesToScan(GetAssembliesToScan("*Chess.Api.dll", "*Chess.dll")); configuration.UsePersistence<InMemoryPersistence>(); configuration.UseContainer<UnityBuilder>(); configuration.UseSerialization<JsonSerializer>(); configuration.Conventions().DefiningEventsAs(type => type.Name.EndsWith("Event")); }
Я бы настоятельно рекомендую использовать универсальный обработчик, это анти шаблон, который будет блокировать вашу способность правильно масштабировать и ввести связь ... Держите его простой и явный и иметь обработчик для каждого события ... –
@Sean: причина, по которой нужно использовать один общий обработчик, заключается в том, что этот обработчик отправит полученное сообщение другому процессору сообщений, который содержит/определяет отдельные обработчики сообщений для каждого конкретного сообщение. Причина, по которой я выбрал это, состоит в том, что я смешиваю «обычные» службы WCF с NServiceBus и хочу использовать NServiceBus исключительно как инфраструктурный компонент, а не содержать фактическую бизнес-логику или саги внутри своих обработчиков. –
круто, ты его заработал? вы видели мой комментарий ниже? –