NEventStore NServiceBus设置
使用NEventStore时,您如何集成到NServiceBus 我是NSB ans ES的新手,尝试找出使用ES和CQR时NSB的最佳设置 我以与示例中DispatchCommit相同的方式连接到NSB,NEventStore NServiceBus设置,nservicebus,cqrs,neventstore,Nservicebus,Cqrs,Neventstore,使用NEventStore时,您如何集成到NServiceBus 我是NSB ans ES的新手,尝试找出使用ES和CQR时NSB的最佳设置 我以与示例中DispatchCommit相同的方式连接到NSB, 您是发布整个提交还是提交事件 您是否因为NSB要求在邮件上使用IMessage而在邮件周围创建包装器?那么,如何发布到正确的队列?因为与OrderSubmittedEvent相比,包装器是通用的。如果可能的话,我不希望我的事件依赖于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;
}
}
公共密封类NServiceBusPublisher:IPPublishMessages
{
私有常量字符串AggregateIdKey=“AggregateId”;
私有常量字符串CommitVersionKey=“CommitVersion”;
私有常量字符串EventVersionKey=“EventVersion”;
私有常量字符串BusPrefixKey=“总线。”;
专用只读IBus总线;
公共NServiceBusPublisher(IBus总线)
{
这辆公共汽车=公共汽车;
}
公共空间处置()
{
总干事(本);
}
公共无效发布(提交)
{
对于(var i=0;ix.Key.StartsWith(BusPrefixKey));
foreach(标头中的var标头)
{
var key=header.key.Substring(BusPrefixKey.Length);
var value=(header.value??string.Empty).ToString();
message.SetHeader(键、值);
}
}
私有静态版本(提交,int-index)
{
var busMessage=commit.Events[index].Body作为IMessage;
SetHeader(AggregateIdKey,commit.StreamId.ToString());
SetHeader(CommitVersionKey,commit.StreamRevision.ToString());
SetHeader(EventVersionKey,GetSpecificEventVersion(提交,索引).ToString());
}
私有静态int GetSpecificEventVersion(提交、提交、int索引)
{
//例如:(StreamRevision:120)-(5个事件)+1+(索引@4:最后一个索引)=事件版本:120
返回commit.StreamRevision-commit.Events.Count+1+索引;
}
}
在第三版NSB中引入了名为的功能。有了它,您就可以在您的域中摆脱NSB依赖
NServiceBus V3中的这一新功能允许您传入自己的服务
用于确定哪些类型是消息定义的约定
使用IMessage、ICommand或IEvent接口的方法
好的,那么你在你的域中对NSB有依赖关系?谢谢你,乔纳森!是的,很不幸。对我来说,“域事件”和你在网上发布的事件没有区别。CQR内部对此存在一些争论。