2011-04-06 3 views
5

EventStore를 사용할 때 NServiceBus에 어떻게 통합합니까?EventStore NServiceBus 설정

저는 NSB ans ES를 처음 사용하고 ES 및 CQRS를 사용할 때 NSB를위한 최상의 설정을 알아 내려고합니다.

내가 예 DispatchCommit로 NSB에 같은 방식으로 후킹하고있어, https://github.com/joliver/EventStore/blob/master/doc/EventStore.Example/MainProgram.cs

  1. 당신은 전체 커밋 또는 Commit.Events 게시합니까?
  2. NSB에서 메시지에 IMessage가 필요하기 때문에 메시지 주위에 래퍼를 만드시겠습니까? 그러면 올바른 대기열에 게시하는 방법은 무엇입니까? 래퍼는 예를 들어 OrderSubmittedEvent와는 대조적으로 일반적이기 때문에. 가능한 경우 NSB에 대한 의존도를 내 이벤트에 대해 원하지 않습니다. 왜냐하면 내 도메인에도 NSB가 있기 때문입니다.

일부 코드 또는 지침은 정말 감사하겠습니다.

답변

4

는 여기에 내가 생산에 사용하고있는 작업은 다음과 같습니다 NSB의 세 번째 버전에서

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가 종속되어 있습니까? 감사합니다. 조나단! –

+0

예, 불행히도. 나를 위해 "도메인 이벤트"와 당신이 전선에 끼운 이벤트 사이에는 차이가 없습니다. CQRS에는 이것에 대한 몇 가지 논쟁이 있습니다. –

2

을 기능 Unobtrusive mode 이름을 소개했다. 그것으로 당신은 귀하의 도메인에서 NSB 의존성을 제거 할 수 있습니다.

NServiceBus V3에서이 새로운 기능을 사용하면 iMessage를, ICommand의 또는 IEvent 인터페이스를 사용하는 대신 메시지 정의되는 유형을 결정하기 위해 자신의 규칙에 전달할 수 있습니다.