使用NEventStore时如何集成到NServiceBus ?
我是NSB和ES的新手,试图在使用ES和CQRS时找出NSB的最佳设置。
我钩到NSB相同的方式DispatchCommit在例子中,https://github.com/joliver/EventStore/blob/master/doc/EventStore.Example/MainProgram.cs
- 你是发布整个Commit还是Commit. events ?
- 你是否因为NSB需要在你的消息上使用IMessage而创建了一个包装器?那么如何发布到正确的队列呢?因为与OrderSubmittedEvent(例如)相比,wrapper是通用的。如果可能的话,我不希望我的事件依赖于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;
}
}
在NSB的第三个版本中引入了名为Unobtrusive mode的特性。有了它,你可以在你的域中摆脱NSB依赖。
NServiceBus V3中的这个新特性允许你传入你自己的约定来确定哪些类型是消息定义使用IMessage、iccommand或IEvent接口