diff --git a/Rhino.ServiceBus.Tests/Rhino.ServiceBus.Tests.csproj b/Rhino.ServiceBus.Tests/Rhino.ServiceBus.Tests.csproj index 98751bc..bc30cc2 100644 --- a/Rhino.ServiceBus.Tests/Rhino.ServiceBus.Tests.csproj +++ b/Rhino.ServiceBus.Tests/Rhino.ServiceBus.Tests.csproj @@ -106,7 +106,7 @@ - + diff --git a/Rhino.ServiceBus.Tests/RhinoQueues/CanAddHeadersToMessage.cs b/Rhino.ServiceBus.Tests/RhinoQueues/CanAddHeadersToMessage.cs deleted file mode 100644 index e2a5fec..0000000 --- a/Rhino.ServiceBus.Tests/RhinoQueues/CanAddHeadersToMessage.cs +++ /dev/null @@ -1,70 +0,0 @@ -using System; -using Castle.MicroKernel.Registration; -using Castle.Windsor; -using Rhino.Queues; -using Rhino.ServiceBus.Impl; -using Rhino.ServiceBus.RhinoQueues; -using Xunit; - -namespace Rhino.ServiceBus.Tests.RhinoQueues -{ - public class CanAddHeadersToMessage:IDisposable - { - private WindsorContainer container; - - public CanAddHeadersToMessage() - { - container = new WindsorContainer("RhinoQueues/RhinoQueues.config"); - - container.Register(Component.For>().ImplementedBy()); - container.AddFacility("rhino.esb", new RhinoServiceBusFacility()); - - - } - - - [Fact] - public void it_should_add_custom_header_to_headers_collection() - { - var builder = container.Resolve>(); - builder.Initialize(new Endpoint {Uri = RhinoQueuesOneWayBus.NullEndpoint}); - var msg = builder.BuildFromMessageBatch("somemsg"); - Assert.NotNull(msg); - Assert.NotEqual(0,msg.Data.Length); - Assert.Equal("mikey",msg.Headers["user-id"]); - - } - - public class CustomHeaderBuilder : IMessageBuilder - { - private IMessageBuilder inner; - - public CustomHeaderBuilder(IMessageBuilder inner) - { - this.inner = inner; - } - - public MessagePayload BuildFromMessageBatch(params object[] msgs) - { - var payload = inner.BuildFromMessageBatch(msgs); - Contextualize(payload); - return payload; - } - - public void Initialize(Endpoint source) - { - inner.Initialize(source); - } - - private static void Contextualize(MessagePayload message) - { - message.Headers.Add("user-id","mikey"); - } - } - - public void Dispose() - { - container.Dispose(); - } - } -} \ No newline at end of file diff --git a/Rhino.ServiceBus.Tests/RhinoQueues/CustomizingMessageConstruction.cs b/Rhino.ServiceBus.Tests/RhinoQueues/CustomizingMessageConstruction.cs new file mode 100644 index 0000000..055697c --- /dev/null +++ b/Rhino.ServiceBus.Tests/RhinoQueues/CustomizingMessageConstruction.cs @@ -0,0 +1,90 @@ +using System; +using System.Collections.Specialized; +using Castle.Core; +using Castle.MicroKernel.Registration; +using Castle.Windsor; +using Rhino.Queues; +using Rhino.ServiceBus.Impl; +using Rhino.ServiceBus.Internal; +using Rhino.ServiceBus.RhinoQueues; +using Xunit; + +namespace Rhino.ServiceBus.Tests.RhinoQueues +{ + public class CustomizingMessageConstruction + { + + [Fact] + public void it_should_add_custom_header_to_headers_collection_using_builder() + { + using( var container = new WindsorContainer("RhinoQueues/RhinoQueues.config")) + { + container.Register(Component.For>().ImplementedBy());//before facility + container.AddFacility("rhino.esb", new RhinoServiceBusFacility()); + + var builder = container.Resolve>(); + builder.Initialize(new Endpoint { Uri = RhinoQueuesOneWayBus.NullEndpoint }); + var msg = builder.BuildFromMessageBatch("somemsg"); + Assert.NotNull(msg); + Assert.NotEqual(0, msg.Data.Length); + Assert.Equal("mikey", msg.Headers["user-id"]); + } + + } + + [Fact] + public void it_should_add_custom_header_to_headers_collection_using_interface() + { + using (var container = new WindsorContainer("RhinoQueues/RhinoQueues.config")) + { + container.AddFacility("rhino.esb", new RhinoServiceBusFacility()); + container.Register(Component.For().ImplementedBy().LifeStyle.Is(LifestyleType.Transient)); + + var builder = container.Resolve>(); + builder.Initialize(new Endpoint { Uri = RhinoQueuesOneWayBus.NullEndpoint }); + var msg = builder.BuildFromMessageBatch("somemsg"); + Assert.NotNull(msg); + Assert.NotEqual(0, msg.Data.Length); + Assert.Equal("mikey", msg.Headers["user-id"]); + } + + } + + public class CustomHeaderBuilder : IMessageBuilder + { + private IMessageBuilder inner; + + public CustomHeaderBuilder(IMessageBuilder inner) + { + this.inner = inner; + } + + public MessagePayload BuildFromMessageBatch(params object[] msgs) + { + var payload = inner.BuildFromMessageBatch(msgs); + Contextualize(payload); + return payload; + } + + public void Initialize(Endpoint source) + { + inner.Initialize(source); + } + + private static void Contextualize(MessagePayload message) + { + message.Headers.Add("user-id","mikey"); + } + } + public class AppIdentityCustomizer : ICustomizeMessageHeaders + { + public void Customize(NameValueCollection headers) + { + headers.Add("user-id","mikey"); + } + } + + } + + +} \ No newline at end of file diff --git a/Rhino.ServiceBus/ICustomizeMessageHeaders.cs b/Rhino.ServiceBus/ICustomizeMessageHeaders.cs new file mode 100644 index 0000000..66f6295 --- /dev/null +++ b/Rhino.ServiceBus/ICustomizeMessageHeaders.cs @@ -0,0 +1,9 @@ +using System.Collections.Specialized; + +namespace Rhino.ServiceBus +{ + public interface ICustomizeMessageHeaders + { + void Customize(NameValueCollection headers); + } +} \ No newline at end of file diff --git a/Rhino.ServiceBus/IMessageBuilder.cs b/Rhino.ServiceBus/Internal/IMessageBuilder.cs similarity index 79% rename from Rhino.ServiceBus/IMessageBuilder.cs rename to Rhino.ServiceBus/Internal/IMessageBuilder.cs index 211f1ac..906291a 100644 --- a/Rhino.ServiceBus/IMessageBuilder.cs +++ b/Rhino.ServiceBus/Internal/IMessageBuilder.cs @@ -1,4 +1,4 @@ -namespace Rhino.ServiceBus +namespace Rhino.ServiceBus.Internal { public interface IMessageBuilder { diff --git a/Rhino.ServiceBus/Msmq/MsmqOnewayBus.cs b/Rhino.ServiceBus/Msmq/MsmqOnewayBus.cs index 0527b48..a64c206 100644 --- a/Rhino.ServiceBus/Msmq/MsmqOnewayBus.cs +++ b/Rhino.ServiceBus/Msmq/MsmqOnewayBus.cs @@ -1,5 +1,6 @@ using System.Messaging; using Rhino.ServiceBus.Impl; +using Rhino.ServiceBus.Internal; namespace Rhino.ServiceBus.Msmq { diff --git a/Rhino.ServiceBus/Rhino.ServiceBus.csproj b/Rhino.ServiceBus/Rhino.ServiceBus.csproj index c9d37ee..39c5018 100644 --- a/Rhino.ServiceBus/Rhino.ServiceBus.csproj +++ b/Rhino.ServiceBus/Rhino.ServiceBus.csproj @@ -97,6 +97,7 @@ + @@ -217,7 +218,7 @@ - + diff --git a/Rhino.ServiceBus/RhinoQueues/RhinoQueuesMessageBuilder.cs b/Rhino.ServiceBus/RhinoQueues/RhinoQueuesMessageBuilder.cs index 85747e7..aabcb31 100644 --- a/Rhino.ServiceBus/RhinoQueues/RhinoQueuesMessageBuilder.cs +++ b/Rhino.ServiceBus/RhinoQueues/RhinoQueuesMessageBuilder.cs @@ -1,4 +1,5 @@ using System; +using System.Collections.Specialized; using System.IO; using Rhino.Queues; using Rhino.ServiceBus.Internal; @@ -40,9 +41,19 @@ public MessagePayload BuildFromMessageBatch(params object[] msgs) {"source", endpoint.Uri.ToString()}, } }; + + TryCustomizeHeaders(payload.Headers); return payload; } - + + private void TryCustomizeHeaders(NameValueCollection headers) + { + if (MessageHeaders == null) + return; + MessageHeaders.Customize(headers); + } + + public ICustomizeMessageHeaders MessageHeaders { get; set; } public void Initialize(Endpoint source) { endpoint = source;