首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >NEventStore NServiceBus设置

NEventStore NServiceBus设置
EN

Stack Overflow用户
提问于 2011-04-06 09:23:33
回答 2查看 2K关注 0票数 5

如何在使用NServiceBus时集成到NEventStore?

我是NSB和ES的新手,并且试图在使用ES和CQRS时为NSB找出最佳的设置。

我和DispatchCommit (例如,https://github.com/joliver/EventStore/blob/master/doc/EventStore.Example/MainProgram.cs )用同样的方式连接到NSB

  1. 您发布整个提交或Commit.Events吗?
  2. 您是否因为NSB需要消息上的IMessage而为您的消息创建一个包装器?那么,如何发布到正确的队列呢?例如,因为包装器是通用的,而不是OrderSubmittedEvent。如果可能的话,我不希望在我的事件中依赖NSB,因为我也在我的域中。

一些代码或指导是非常感谢的。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2011-04-06 11:10:57

下面是我在生产中使用的内容:

代码语言:javascript
复制
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;
    }
}
票数 4
EN

Stack Overflow用户

发布于 2012-10-11 19:55:00

在NSB的第三个版本中引入了名为非突进模式的特性。有了它,您就可以摆脱域中的NSB依赖。

NServiceBus V3中的这个新特性允许您传递自己的约定,以确定哪些类型是消息定义,而不是使用IMessage、ICommand或IEvent接口。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/5564130

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档