簡體   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