【发布时间】:2016-08-09 11:25:11
【问题描述】:
我有一个 PurchaseOrder 聚合根,它有两个方法 FinalizeOrder 和 CancelOrder,它们都记录事件:OrderFinaziled 和 OrderCancelled。我被困在建模订单存储库中,我可以使用存储库模式中的这些事件来更新数据库中的实体吗?我不会在每次更改后保存整个聚合根,我只想保存已更改的字段,我使用的是 SqlClient,没有 ORM。
我的聚合根基类:
public class AggregateRootBase<TID> : EntityBase<TID>
{
public AggregateRootBase(TID id) : base(id)
{
}
private readonly List<IDomainEvent> recordedEvents = new List<IDomainEvent>();
public IEnumerable<IDomainEvent> GetEvents()
{
return recordedEvents;
}
public void MarkEventsAsProcessed()
{
recordedEvents.Clear();
}
protected void RecordEvent(IDomainEvent @event)
{
recordedEvents.Add(@event);
}
}
PurchaseOrder 类(跳过大多数属性):
public class PurchaseOrder : AggregateRootBase<int>
{
public PurchaseOrder(int id) : base(id)
{
IsFinalized = false;
IsCancelled = false;
}
public bool IsFinalized { get; set; }
public bool IsCancelled { get; set; }
public void FinalizeOrder()
{
IsFinalized = true;
RecordEvent(new OrderFinalized(Id,IsFinalized));
}
public void CancellOrder()
{
IsCancelled = true;
RecordEvent(new OrderCancelled(Id,IsCancelled));
}
}
和存储库:
public class PurchaseOrderRepository
{
void Save(PurchaseOrder purchaseOrder)
{
var events = purchaseOrder.GetEvents();
foreach (var evt in events)
{
if(evt.GetType() == typeof(OrderFinalized))
// use event args and update field using SqlCommand
else if (evt.GetType() == typeof(OrderCancelled))
// use event args and Update field Using SqlCommand
}
}
}
我还有一个 EventDispatcher,它在 AggregateRoot 成功持久化后调度事件(电子邮件通知)。
【问题讨论】:
标签: c# events repository domain-driven-design aggregateroot