現在、バックエンドで 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")); }