NEventStore NServiceBus设置

NEventStore NServiceBus设置,nservicebus,cqrs,neventstore,Nservicebus,Cqrs,Neventstore,使用NEventStore时,您如何集成到NServiceBus 我是NSB ans ES的新手,尝试找出使用ES和CQR时NSB的最佳设置 我以与示例中DispatchCommit相同的方式连接到NSB, 您是发布整个提交还是提交事件 您是否因为NSB要求在邮件上使用IMessage而在邮件周围创建包装器?那么,如何发布到正确的队列?因为与OrderSubmittedEvent相比,包装器是通用的。如果可能的话,我不希望我的事件依赖于NSB,因为我的域中也有它 非常感谢您提供一些代码或指导。

使用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内部对此存在一些争论。