5

NEventStore を使用する場合、どのように NServiceBus に統合しますか?

私はNSB ans ESを初めて使用し、ESとCQRSを使用する場合のNSBの最適なセットアップを見つけようとしています。

例の DispatchCommit と同じ方法で NSB に接続してい ます。 https://github.com/joliver/EventStore/blob/master/doc/EventStore.Example/MainProgram.cs

  1. Commit または Commit.Events 全体を公開しますか?
  2. NSB はメッセージに IMessage を必要とするため、メッセージの周りにラッパーを作成しますか? では、正しいキューにどのように公開しますか? たとえば、 OrderSubmittedEvent とは対照的に、ラッパーは汎用であるためです。可能であれば、イベントの NSB への依存を望んでいません。これは、ドメインにもそれがあるためです。

いくつかのコードまたはガイダンスは本当に感謝しています。

4

2 に答える 2

4

これが私が生産で使用しているものです:

public sealed class NServiceBusPublisher : IPublishMessages
{
    private const string AggregateIdKey = "AggregateId";
    private const string CommitVersionKey = "CommitVersion";
    private const string EventVersionKey = "EventVersion";
    private const string BusPrefixKey = "Bus.";
    private readonly IBus bus;

    public NServiceBusPublisher(IBus bus)
    {
        this.bus = bus;
    }

    public void Dispose()
    {
        GC.SuppressFinalize(this);
    }

    public void Publish(Commit commit)
    {
        for (var i = 0; i < commit.Events.Count; i++)
        {
            var eventMessage = commit.Events[i];
            var busMessage = eventMessage.Body as IMessage;
            AppendHeaders(busMessage, commit.Headers); // optional
            AppendHeaders(busMessage, eventMessage.Headers); // optional
            AppendVersion(commit, i); // optional
            this.bus.Publish(busMessage);
        }
    }
    private static void AppendHeaders(IMessage message, IEnumerable<KeyValuePair<string, object>> headers)
    {
        headers = headers.Where(x => x.Key.StartsWith(BusPrefixKey));
        foreach (var header in headers)
        {
            var key = header.Key.Substring(BusPrefixKey.Length);
            var value = (header.Value ?? string.Empty).ToString();
            message.SetHeader(key, value);
        }
    }
    private static void AppendVersion(Commit commit, int index)
    {
        var busMessage = commit.Events[index].Body as IMessage;
        busMessage.SetHeader(AggregateIdKey, commit.StreamId.ToString());
        busMessage.SetHeader(CommitVersionKey, commit.StreamRevision.ToString());
        busMessage.SetHeader(EventVersionKey, GetSpecificEventVersion(commit, index).ToString());
    }
    private static int GetSpecificEventVersion(Commit commit, int index)
    {
        // e.g. (StreamRevision: 120) - (5 events) + 1 + (index @ 4: the last index) = event version: 120
        return commit.StreamRevision - commit.Events.Count + 1 + index;
    }
}
于 2011-04-06T11:10:57.570 に答える
2

NSBの3番目のバージョンでは、目立たないモードという名前の機能が導入されました。これを使用すると、ドメイン内のNSB依存関係を取り除くことができます。

NServiceBus V3のこの新機能を使用すると、IMessage、ICommand、またはIEventインターフェイスを使用する代わりに、独自の規則を渡して、どのタイプがメッセージ定義であるかを判別できます。

于 2012-10-11T19:55:00.630 に答える