【发布时间】: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