[英]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
{
}
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部分中,我們設置了端點名稱,它與Publisher項目中EndpontConfig類的名稱空間相同。
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.