public void Invoke(OutgoingContext context, Action next) { if (context.OutgoingLogicalMessage.IsControlMessage()) { next(); return; } var timeToBeReceived = context.OutgoingLogicalMessage.Metadata.TimeToBeReceived; var message = context.OutgoingLogicalMessage.Instance; foreach (var property in Conventions.GetDataBusProperties(message)) { var propertyValue = property.GetValue(message, null); if (propertyValue == null) { continue; } using (var stream = new MemoryStream()) { var dataBusProperty = propertyValue as IDataBusProperty; if (dataBusProperty != null) { propertyValue = dataBusProperty.GetValue(); } DataBusSerializer.Serialize(propertyValue, stream); stream.Position = 0; string headerValue; using (new TransactionScope(TransactionScopeOption.Suppress)) { headerValue = DataBus.Put(stream, timeToBeReceived); } string headerKey; if (dataBusProperty != null) { dataBusProperty.Key = headerValue; //we use the headers to in order to allow the infrastructure (eg. the gateway) to modify the actual key headerKey = headerValue; } else { property.SetValue(message, null, null); headerKey = String.Format("{0}.{1}", message.GetType().FullName, property.Name); } //we use the headers to in order to allow the infrastructure (eg. the gateway) to modify the actual key context.OutgoingLogicalMessage.Headers["NServiceBus.DataBus." + headerKey] = headerValue; } } next(); }
public void Invoke(IncomingContext context, Action next) { var message = context.IncomingLogicalMessage.Instance; foreach (var property in Conventions.GetDataBusProperties(message)) { var propertyValue = property.GetValue(message, null); var dataBusProperty = propertyValue as IDataBusProperty; string headerKey; if (dataBusProperty != null) { headerKey = dataBusProperty.Key; } else { headerKey = String.Format("{0}.{1}", message.GetType().FullName, property.Name); } string dataBusKey; if (!context.IncomingLogicalMessage.Headers.TryGetValue("NServiceBus.DataBus." + headerKey, out dataBusKey)) { continue; } using (new TransactionScope(TransactionScopeOption.Suppress)) using (var stream = DataBus.Get(dataBusKey)) { var value = DataBusSerializer.Deserialize(stream); if (dataBusProperty != null) { dataBusProperty.SetValue(value); } else { property.SetValue(message, value, null); } } } next(); }