public void SaveAggregateRoot <TAggregateRoot>(TAggregateRoot aggregate) where TAggregateRoot : IAggregateRoot { if (aggregate.GetUncommittedChanges().Any()) { //在锁内程序执行过程中,会有多次对该聚合根的更改请求 lock (Lock) { //如果不是新增事件 if (aggregate.Version != -1) { var lastestEvent = eventStorage.GetLastEvent(((dynamic)aggregate).AggregateId); if (lastestEvent != null && lastestEvent.Version != aggregate.Version) { throw new Exception("事件库中该聚合的状态版本与当前传入聚合状态版本不同,可能已被更新"); } } //保存到事件存储 eventStorage.SaveAggregateRoot(aggregate); foreach (var @event in aggregate.GetUncommittedChanges()) { eventBus.Publish(@event); } } aggregate.MarkChangesAsCommitted(); } }