protected virtual void Restore(
            ReadModelState snapshot,
            bool startListeners = true,
            bool block          = false,
            int msTimeout       = 1000)
        {
            if (StartingState != null)
            {
                throw new InvalidOperationException("ReadModel has already been restored.");
            }
            Ensure.NotNull(snapshot, nameof(snapshot));
            StartingState = snapshot;
            ApplyState(StartingState);
            if (!startListeners || StartingState.Checkpoints == null)
            {
                return;
            }

            foreach (var stream in StartingState.Checkpoints)
            {
                Start(stream.Item1, stream.Item2, block, msTimeout);
            }
        }
 protected abstract void ApplyState(ReadModelState snapshot);