2011-04-06 68 views
5

如何在使用EventStore時集成到NServiceBus?EventStore NServiceBus設置

我是新來的NSB ans ES,並試圖找出使用ES和CQRS時NSB的最佳設置。

我鉤住NSB如DispatchCommit例如,在相同的方式, https://github.com/joliver/EventStore/blob/master/doc/EventStore.Example/MainProgram.cs

  1. 你發佈整個提交或Commit.Events?
  2. 你是否爲你的消息創建了一個包裝,因爲NSB在你的消息中需要IMessage?你如何發佈到正確的隊列呢?因爲與OrderSubmittedEvent相比,包裝是通用的。如果可能的話,我不希望依賴於NSB來處理我的事件,因爲那時我也在我的域中擁有它。

一些代碼或指導真的很感激。

回答

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; 
    } 
} 
+1

好吧,所以你有一個依賴於你的域NSB? 謝謝喬納森! – 2011-04-06 17:03:31

+0

是的,不幸的。對於我來說,「域名事件」和你在網絡上的事件沒有區別。在CQRS中對此有一些爭論。 – 2011-04-07 03:12:21

2

在第三個版本NSB的引入命名爲Unobtrusive mode功能。有了它,你可以擺脫你的域名的NSB依賴。

在NServiceBus V3這個新功能可以讓你在自己的 約定傳遞,以確定哪些類型的消息定義使用即時聊天,ICommand的或IEvent接口,而不是 。