【问题标题】:Event Sourcing Event typed against an Aggregate事件溯源 针对聚合键入的事件
【发布时间】:2014-11-30 05:01:39
【问题描述】:

在此处输入代码我希望强制执行特定类型的聚合,可以与事件一起使用。

我有一个基本的 IEventHandler 接口:-

  public interface IEventHandler<TEvent> where TEvent : IEvent
    {
        void Handle(TEvent @event);
    }

Event Base 类继承自:-

public class Event : IEvent
    {
        #region Constructors

        public Event(Guid aggregateRootId)
        {
            Timestamp = DateTime.Now;
            Id = Guid.NewGuid();
            AggregateRootId = aggregateRootId;

        }

        #endregion

        #region Implementation of IEvent<Guid,Guid>

        public Guid Id { get; private set; }

        public Guid AggregateRootId { get; private set; }

        public int Version { get; set; }
        public DateTime Timestamp { get; private set; }

        #endregion
    }

现在我需要制作我的聚合或类特定事件:-

  public class ClientNameChangedEvent : Event
        {
            #region Constructors

            public ClientNameChangedEvent(Guid aggregateRootId, string name, int version) : base(aggregateRootId)
            {
                Name = name;
                Version = version;
            }

            #endregion

            #region Properties

            public string Name { get; private set; }

            #endregion
        }

顾名思义,我只想对客户端聚合使用它。我想要一种方法来防止程序员注册事件,将其与另一个聚合相关联,在下面的示例中,我在客户端事件中针对案例聚合注册了一个兴趣。

public class Case : AggregateRoot, IEventHandler<ClientNameChangedEvent>
    {

        #region Properties
        public string Name { get; private set; }

        #endregion

        public Case()
        {

        }

        public Case(Guid id, string name) : base(id)
        {

        }

        public void ChangeName(string name)
        {
            if (!Name.ToUpper().Equals(name.ToUpper()))
            {
                ApplyChange(new ClientNameChangedEvent(Id, name, Version));
            }
        }

        public void Handle(ClientNameChangedEvent @event)
        {
            Name = @event.Name;
            Version = @event.Version + 1;
        }

        public void Handle(ClientCreatedEvent @event)
        {
            Id = @event.AggregateRootId;
            Name = @event.Name;
            Version = @event.Version;
        }
    }
}

如何防止这种情况发生?

【问题讨论】:

  • 只是好奇,为什么要阻止事件被订阅?
  • 因为我不希望将 ClientNameChangedEvent 用于 Case ,它应该只针对客户端。
  • 那么,您的活动是发布到队列,而不是主题或广播目的地?
  • 正确,我计划重新考虑事件如何与聚合相关联。

标签: events generics cqrs event-sourcing


【解决方案1】:

事件通过 aggregateId 绑定到特定聚合。当你准备一个聚合时,你通过 id 加载它以前的事件。然后,您将与该 ID 关联的所有过去事件(假设没有快照)应用到聚合。

事件订阅不是在域端,而是在读取端。多个非规范化器可以“处理”任何一个事件。

要更深入地了解流程,请查看我的帖子:CQRS Step-By-Step Guide to the Flow of a Typical Application

祝你好运 - 我希望它有所帮助

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2023-03-14
    • 2018-10-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-07-16
    • 1970-01-01
    相关资源
    最近更新 更多