public void Dispatch(ImmutableEnvelope e) { var commands = e.Items.Select(i => (ICommand <IIdentity>)i.Content).ToList(); var id = commands.First().Id; var builder = new StringBuilder(); var old = Context.SwapFor(s => builder.AppendLine(s)); Applied results; try { results = Load(commands); } finally { Context.SwapFor(old); } var s1 = builder.ToString(); if (!String.IsNullOrEmpty(s1)) { Context.Debug(s1.TrimEnd('\r', '\n')); } AppendToStream(id, e.EnvelopeId, results, s1); PublishEvents(id, results); }
void AppendToStream(IIdentity id, string envelopeId, Applied then, string explanation) { var stream = _factory.GetOrCreateStream(IdentityConvert.ToStream(id)); var b = new EnvelopeBuilder("unknown"); b.AddString("caused-by", envelopeId); if (!String.IsNullOrEmpty(explanation)) { b.AddString("explain", explanation); } foreach (var e in then.Events) { b.AddItem((object)e); } var data = _streamer.SaveEnvelopeData(b.Build()); Context.Debug("?? Append {0} at v{3} to '{1}' in thread {2}", then.Events.Count, IdentityConvert.ToStream(id), Thread.CurrentThread.ManagedThreadId, then.Version); if (!stream.TryAppend(data, TapeAppendCondition.VersionIs(then.Version))) { throw new InvalidOperationException("Failed to update the stream - it has been changed concurrently"); } }