示例#1
0
        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);
        }