我希望将NServiceBus与GetEventStore一起使用来创建CQRS / EventSourcing解决方案。
我有一组事件,每个事件都标有聚合类型名称和聚合ID。我的域使用NServiceBus发布事件。所有事件都来自一种基本类型。
我想创建消息处理程序,它订阅域发布的所有事件,因此它可以在EventStore中保存事件。
我尝试订阅我的基本活动,但它不起作用。
有没有办法订阅所有类型的活动?每次创建新域事件时,我也不想更改NServiceBus配置或在EventStore工作器中添加新处理程序。
答案 0 :(得分:0)
我设法解决了这个问题。我有一个基本的Event类,我发布了从基类Event类派生的事件。在我的订阅者上,我订阅了基本事件,并且每次发布派生事件时都会触发Handle方法。
public class Event : IEvent
{
}
public class Event1 : Event
{
}
public class Event2 : Event
{
}
namespace SemplePublisherNamespace
{
using NServiceBus;
public class EndpointConfig : IConfigureThisEndpoint, AsA_Publisher
{
}
}
public class OnBusStart : IWantToRunWhenBusStartsAndStops
{
public IBus Bus { get; set; }
void IWantToRunWhenBusStartsAndStops.Start()
{
Bus.Publish(new Event1());
Bus.Publish(new Event2());
}
void IWantToRunWhenBusStartsAndStops.Stop()
{
}
}
<?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>
namespace SampleSubscriber
{
using NServiceBus;
public class EndpointConfig : IConfigureThisEndpoint, AsA_Server
{
}
}
<?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
传递,可以实现自己的消息级安全性/完整性(签名和/或加密)。