2016-01-01 4 views
0

В настоящее время я разрабатываю пример проекта, в котором я использую 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")); 
    } 
    
+1

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

+0

@Sean: причина, по которой нужно использовать один общий обработчик, заключается в том, что этот обработчик отправит полученное сообщение другому процессору сообщений, который содержит/определяет отдельные обработчики сообщений для каждого конкретного сообщение. Причина, по которой я выбрал это, состоит в том, что я смешиваю «обычные» службы WCF с NServiceBus и хочу использовать NServiceBus исключительно как инфраструктурный компонент, а не содержать фактическую бизнес-логику или саги внутри своих обработчиков. –

+0

круто, ты его заработал? вы видели мой комментарий ниже? –

ответ

0

Ваша конфигурация определяет событие, как любой класс, который заканчивается «Событие». «Объект» не отвечает этим критериям, поэтому из-за этого вы не будете получать сообщения в своем общем обработчике.

Вы должны были бы использовать вместо IEvent:

public sealed class GenericHandler : IHandleMessages<IEvent> { } 
+1

Если вы наследуете NServiceBus.IEvent, вам фактически не нужно использовать 'configuration.Conventions(). DefiningEventsAs' –

Смежные вопросы