Exemplo n.º 1
0
        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();
            }
        }