繁体   English   中英

NServiceBus的EventSourcing订阅所有事件

[英]EventSourcing with NServiceBus Subscribe to all Events

我想将NServiceBus与GetEventStore一起使用来创建CQRS / EventSourcing解决方案。

我有一组事件,每个事件都标有“聚合类型”名称和“聚合ID”。 我的域使用NServiceBus发布事件。 所有事件都源自一种基本类型。

我想要创建消息处理程序,该消息处理程序订阅域发布的所有事件,以便可以将事件保存在EventStore中。

我尝试订阅我的基本活动,但不起作用。

有什么方法可以订阅所有类型的事件? 我也不想每次创建新的域事件时都更改NServiceBus配置或在EventStore工作线程中添加新的处理程序。

我设法解决了这个问题。 我有一个基本的Event类,并且发布了从基本Event类派生的事件。 在我的订户上,我订阅了基本Event,并且每次发布派生事件时都会触发Handle方法。

讯息专案

public class Event : IEvent
{
}
public class Event1 : Event
{
}
public class Event2 : Event
{
}

发行人专案

发布者EndpointConfig

namespace SemplePublisherNamespace
{
    using NServiceBus;
    public class EndpointConfig : IConfigureThisEndpoint, AsA_Publisher
    {

    }
}

出版商OnBusStart类

public class OnBusStart : IWantToRunWhenBusStartsAndStops
{
    public IBus Bus { get; set; }
    void IWantToRunWhenBusStartsAndStops.Start()
    {
        Bus.Publish(new Event1());
        Bus.Publish(new Event2());
    }

    void IWantToRunWhenBusStartsAndStops.Stop()
    {
    }
}

发布者app.config

<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<configuration>
  <configSections>
    <section name="MessageForwardingInCaseOfFaultConfig" type="NServiceBus.Config.MessageForwardingInCaseOfFaultConfig, NServiceBus.Core" />
    <section name="AuditConfig" type="NServiceBus.Config.AuditConfig, NServiceBus.Core"/>
  </configSections>
  <MessageForwardingInCaseOfFaultConfig ErrorQueue="error"/>
  <AuditConfig QueueName="audit" />
</configuration>

订户项目

订户EndpointConfig

namespace SampleSubscriber
{
    using NServiceBus;

    public class EndpointConfig : IConfigureThisEndpoint, AsA_Server
    {
    }
}

订阅者app.config

<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<configuration>
  <configSections>
    <section name="MessageForwardingInCaseOfFaultConfig" type="NServiceBus.Config.MessageForwardingInCaseOfFaultConfig, NServiceBus.Core" />
    <section name="UnicastBusConfig" type="NServiceBus.Config.UnicastBusConfig, NServiceBus.Core" />
    <section name="AuditConfig" type="NServiceBus.Config.AuditConfig, NServiceBus.Core" />
  </configSections>
  <MessageForwardingInCaseOfFaultConfig ErrorQueue="error" />
  <UnicastBusConfig>
    <MessageEndpointMappings>
      <add Assembly="Messages" Endpoint="SemplePublisherNamespace" />      
    </MessageEndpointMappings>
  </UnicastBusConfig>
  <AuditConfig QueueName="audit" />
</configuration>

请注意,在添加映射的MessageEndpointMappings部分中,我们设置了端点名称,它与Publisher项目中EndpontConfig类的名称空间相同。

订户的Handler类

    public class Subscriber : IHandleMessages<Event>
    {
        public void Handle(Event message)
        {
            Console.WriteLine("Handle: "+message.GetType().Name);
        }

    }

另一种可能的方法是让您的Event充当包含实际内容的通用信封:

public class GenericEnvelope
{
    ...
    public XmlElement Message { get; set; }
}

这仍然允许您订阅一次,然后传递所需的任何内容,但是这种方法的优点是信封可能包含一些属于消息一部分的面向消息的属性。 另一个优点是,将内容作为XmlElement传递可以让您实现自己的消息级安全性/完整性(签名和/或加密)。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM