在此处输入代码我正在寻求强制执行特定类型的聚合,可以使用事件。
我有一个基本的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;
}
}
}
我该如何防止这种情况?
答案 0 :(得分:0)
事件由aggregateId绑定到特定聚合。准备聚合时,您可以通过ID加载之前的事件。然后,将与该id关联的所有过去事件(假设没有快照)应用于聚合。
对事件的订阅不在域方面,而在读取方面。多个非正规化器可以处理&#39;任何一个事件。
有关流程的更深入概述,请查看我的帖子:CQRS Step-By-Step Guide to the Flow of a Typical Application。
祝你好运 - 我希望有所帮助