使用NServiceBus的EventSourcing订阅所有活动

时间:2013-12-10 20:25:57

标签: c# events nservicebus

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

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

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

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

有没有办法订阅所有类型的活动?每次创建新域事件时,我也不想更改NServiceBus配置或在EventStore工作器中添加新处理程序。

2 个答案:

答案 0 :(得分:0)

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

消息项目

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

发布商项目

Publishers EndpointConfig

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

    }
}

Publishers OnBusStart类

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

    void IWantToRunWhenBusStartsAndStops.Stop()
    {
    }
}

Publishers 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中,我们设置了Endpoint名称,它与Publisher项目中EndpontConfig类的名称空间相同。

订阅者的处理程序类

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

    }

答案 1 :(得分:0)

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

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

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