1

現在、バックエンドで NServiceBus を使用してイベントを発行するサンプル プロジェクトを開発しています。バックエンドは、一連のハンドラーを介して独自のイベントを処理することになっています。次のように、イベントごとに 1 つの特定のハンドラーを実装すると、これは正常に機能します。

public sealed class MyEventHandler : IHandleMessages<MyEvent> { }

public sealed class OtherEventHandler : IHandleMessages<OtherEvent> { }

ただし、これらのハンドラーはイベントを別のプロセッサにディスパッチするだけなので、少しクリーンアップして、単一の汎用メッセージ ハンドラーのみを実装したいと考えました。

public sealed class GenericHandler : IHandleMessages<object> { }

残念ながら、ジェネリック ハンドラーは、別の特定のハンドラーがプロジェクトに存在するメッセージ タイプに対してのみ呼び出されます。つまり、ソースに MyEventHandler を残すと、GenericHandler は MyEvent イベントを正しく受信しますが、この (現在は廃止された) ハンドラーを削除すると、このメッセージの受信を停止します。実際、私の目標は、プロジェクトからすべての特定のハンドラーを削除し、単一の GenericHandler でのみ動作することです。構成の基本的な手順が欠けていますか?

NServiceBus-config は次のようになります。

<UnicastBusConfig>
  <MessageEndpointMappings>
    <add Assembly="Kingo.Samples.Chess.Api" Endpoint="kingo.samples.chess" />      
  </MessageEndpointMappings>
</UnicastBusConfig>

さらに:

  • 上記の API アセンブリには、公開して処理する必要があるすべてのイベントが含まれています。
  • すべてのメッセージに、NServiceBusのICommandおよびマーカー インターフェイスを使用してマークを付けました。IEvent
  • NServiceBus V5 (コア) を 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"));
    }
    
4

1 に答える 1

0

構成では、イベントを「Event」で終わる任意のクラスとして定義します。「オブジェクト」はこの基準を満たしていないため、汎用ハンドラーでメッセージを受信しません。

代わりに IEvent を使用する必要があります。

public sealed class GenericHandler : IHandleMessages<IEvent> { }
于 2016-01-01T18:16:07.930 に答える