Exemple #1
0
        public T GetById(Guid id)
        {
            IEnumerable <DomainEvent> events;

            // 从快照中查询最近发生一次领域事件
            var snapshot = _storage.GetSnapshot <BaseSnapshot>(id);

            if (snapshot != null)
            {
                // 如果快照存在,重建过程则从快照事件之后的事件开始重建,而不需要每次从最开始的事件进行重建
                events = _storage.GetEvents(id).Where(e => e.Version >= snapshot.Version);
            }
            else
            {
                // 从不存在则还是需要从最开始的对象开始重建
                events = _storage.GetEvents(id);
            }

            var obj = new T();

            if (snapshot != null)
            {
                ((ISnapshotOrignator)obj).BuildFromSnapshot(snapshot); // 先应用快照中领域事件
            }
            obj.LoadsFromHistory(events);                              // 逐个应用领域事件来重建对象
            return(obj);
        }