事件采购事件针对聚合类型

时间:2014-11-17 15:48:31

标签: events generics cqrs event-sourcing

在此处输入代码我正在寻求强制执行特定类型的聚合,可以使用事件。

我有一个基本的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
    }

现在我需要制作我的Aggregate或Class特定事件: -

  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
        }

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

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;
        }
    }
}

我该如何防止这种情况?

1 个答案:

答案 0 :(得分:0)

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

对事件的订阅不在域方面,而在读取方面。多个非正规化器可以处理&#39;任何一个事件。

有关流程的更深入概述,请查看我的帖子:CQRS Step-By-Step Guide to the Flow of a Typical Application

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