Ejemplo n.º 1
0
        /// <summary>
        /// Execute command via bus
        /// </summary>
        /// <param name="command">CQRS command</param>
        /// <typeparam name="TCommand">Command type</typeparam>
        /// <returns>True if command succeeded</returns>
        protected bool Resolve <TCommand>(TCommand command)
            where TCommand : ICommand
        {
            var lastError = _log.Errors.Observable.FirstOrDefaultAsync().GetAwaiter().GetResult();

            /*_log.Errors.Observable.Subscribe(e =>
             * {
             *  if (e != null && e != lastError)
             *      isError = true;
             * });*/

            var task = _bus.CommandAsync(command).Result;

            task.Wait();
            _manager.Ready.Wait();

            var error   = _log.Errors.Observable.FirstOrDefaultAsync().GetAwaiter().GetResult();
            var isError = error != null && error != lastError;

            if (isError)
            {
                throw new InvalidOperationException(lastError.Message);
            }
            return(!isError);
        }
Ejemplo n.º 2
0
        /// <inheritdoc />
        public async Task Save <T>(T es)
            where T : class, TEventSourced
        {
            if (es == null)
            {
                return;
            }

            var events = es.GetUncommittedEvents().ToList();

            if (events.Count == 0)
            {
                return;
            }

            var stream = await _streams.Find <T>(es.Id, _timeline.Id) ?? _streams.CreateEmpty(es, _timeline.Id); // _streams.GetOrAdd(es, _timeline.Id);

            if (stream.Version >= 0 && es.Version - events.Count < stream.Version)
            {
                throw new InvalidOperationException($"Stream ( {stream.Key}@{stream.Version} ) is ahead of aggregate root with version {es.Version - events.Count} saving {events.Count} events )");
            }

            foreach (var e in events.Cast <Event>())
            {
                if (e.Timestamp == default)
                {
                    e.Timestamp = _timeline.Now;
                }
                if (e.LocalId == default)
                {
                    e.LocalId = new EventId(Configuration.ReplicaName, e.Timestamp);
                }
                if (e.OriginId == default)
                {
                    e.OriginId = e.LocalId;
                }
                e.Stream   = stream.Key;
                e.Timeline = _timeline.Id;
            }

            await _eventStore.AppendToStream(stream, events);

            if (es is ISaga saga)
            {
                var commands = saga.GetUncommittedCommands();
                foreach (var command in commands)
                {
                    await _bus.CommandAsync(command);
                }
            }
#if USE_ES_CACHE
            _cache[stream.Key] = es;
#endif
        }
Ejemplo n.º 3
0
        private async Task <BranchState> ApplyCommands(IEnumerable <ICommand> commands, string timeline)
        {
            await _manager.Branch(timeline);

            var branch = $"{_id.ToString()}";
            await _manager.Branch(branch);

            foreach (var command in commands)
            {
                await _bus.CommandAsync(command);
            }

            await _manager.Branch(timeline);

            return(new BranchState(branch));
        }