/// <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); }
/// <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 }
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)); }