public IMutating MutateIncoming(IMutating command) { CurrentMessage = command.Message; // There are certain headers that we can make note of // These will be committed to the event stream and included in all .Reply or .Publish done via this Unit Of Work // Meaning all receivers of events from the command will get information about the command's message, if they care foreach (var header in Defaults.CarryOverHeaders) { var defaultHeader = ""; command.Headers.TryGetValue(header, out defaultHeader); if (string.IsNullOrEmpty(defaultHeader)) { defaultHeader = NotFound; } var workHeader = $"{Defaults.PrefixHeader}.{header}"; CurrentHeaders[workHeader] = defaultHeader; } CurrentHeaders[$"{Defaults.PrefixHeader}.OriginatingType"] = CurrentMessage.GetType().FullName; // Copy any application headers the user might have included var userHeaders = command.Headers.Keys.Where(h => !h.Equals("CorrId", StringComparison.InvariantCultureIgnoreCase) && !h.Equals("WinIdName", StringComparison.InvariantCultureIgnoreCase) && !h.StartsWith("NServiceBus", StringComparison.InvariantCultureIgnoreCase) && !h.StartsWith("$", StringComparison.InvariantCultureIgnoreCase) && !h.Equals(CommitHeader) && !h.Equals(Defaults.CommitIdHeader, StringComparison.InvariantCultureIgnoreCase) && !h.Equals(Defaults.RequestResponse, StringComparison.InvariantCultureIgnoreCase) && !h.Equals(Defaults.Retries, StringComparison.InvariantCultureIgnoreCase) && !h.Equals(Defaults.EventHeader, StringComparison.InvariantCultureIgnoreCase)); foreach (var header in userHeaders) { CurrentHeaders[header] = command.Headers[header]; } CurrentHeaders[Defaults.InstanceHeader] = Defaults.Instance.ToString(); if (command.Headers.ContainsKey(Headers.CorrelationId)) { CurrentHeaders[Headers.CorrelationId] = command.Headers[Headers.CorrelationId]; } CommitId = Guid.NewGuid(); try { string messageId; // Attempt to get MessageId from NServicebus headers // If we maintain a good CommitId convention it should solve the message idempotentcy issue (assuming the storage they choose supports it) if (CurrentHeaders.TryGetValue(Defaults.MessageIdHeader, out messageId)) { CommitId = Guid.Parse(messageId); } // Allow the user to send a CommitId along with his message if he wants if (CurrentHeaders.TryGetValue(Defaults.CommitIdHeader, out messageId)) { CommitId = Guid.Parse(messageId); } } catch (FormatException) { } // Helpful log and gets CommitId into the dictionary var firstEventId = UnitOfWork.NextEventId(CommitId); Logger.Debug($"Starting unit of work - first event id {firstEventId}"); return(command); }