diff --git a/src/Testing/CoreTests/Runtime/Handlers/HandlerGraphTests.cs b/src/Testing/CoreTests/Runtime/Handlers/HandlerGraphTests.cs index 0cd67f917..a3de0368f 100644 --- a/src/Testing/CoreTests/Runtime/Handlers/HandlerGraphTests.cs +++ b/src/Testing/CoreTests/Runtime/Handlers/HandlerGraphTests.cs @@ -34,8 +34,41 @@ public async Task can_find_the_message_type_by_the_message_type_name_of_one_of_i graph.TryFindMessageType(typeof(IMessageMarker).ToMessageTypeName(), out var markedType).ShouldBeTrue(); markedType.ShouldBe(typeof(MarkedMessage)); } + + [Fact] + public async Task register_message_type() + { + using var host = await Host.CreateDefaultBuilder() + .UseWolverine(opts => + { + opts.RegisterMessageType(typeof(DummyMessage), "custom-alias"); + }).StartAsync(); + + var graph = host.Services.GetRequiredService(); + + graph.TryFindMessageType(typeof(DummyMessage).ToMessageTypeName(), out _).ShouldBeFalse(); + + graph.TryFindMessageType("custom-alias", out var type).ShouldBeTrue(); + type.ShouldBe(typeof(DummyMessage)); + } + + [Fact] + public async Task register_message_types_with_same_alias_throws_invalid_operation_exception() + { + await Should.ThrowAsync(async () => + { + using var host = await Host.CreateDefaultBuilder() + .UseWolverine(opts => + { + opts.RegisterMessageType(typeof(DummyMessage), "custom-alias"); + opts.RegisterMessageType(typeof(string), "custom-alias"); + }).StartAsync(); + }); + } } +public class DummyMessage { } + public interface IMessageMarker; [InteropMessage(typeof(IMessageMarker))] diff --git a/src/Wolverine/Runtime/Handlers/HandlerGraph.cs b/src/Wolverine/Runtime/Handlers/HandlerGraph.cs index 3d95643c9..0b7c25cfe 100644 --- a/src/Wolverine/Runtime/Handlers/HandlerGraph.cs +++ b/src/Wolverine/Runtime/Handlers/HandlerGraph.cs @@ -460,6 +460,22 @@ public void RegisterMessageType(Type messageType) _messageTypes = _messageTypes.AddOrUpdate(messageType.ToMessageTypeName(), messageType); _replyTypes = _replyTypes.Add(messageType); } + + public void RegisterMessageType(Type messageType, string messageAlias) + { + if (_messageTypes.TryFind(messageAlias, out var type)) + { + throw new InvalidOperationException($"Cannot register type {type} with alias {messageAlias} because alias is already used"); + } + + if (_replyTypes.Contains(messageType)) + { + return; + } + + _messageTypes = _messageTypes.AddOrUpdate(messageAlias, messageType); + _replyTypes = _replyTypes.Add(messageType); + } public IEnumerable AllChains() { diff --git a/src/Wolverine/WolverineOptions.cs b/src/Wolverine/WolverineOptions.cs index 8b824b6f8..89a2071bf 100644 --- a/src/Wolverine/WolverineOptions.cs +++ b/src/Wolverine/WolverineOptions.cs @@ -299,4 +299,9 @@ internal void ReadJasperFxOptions(JasperFxOptions jasperfx) _autoBuildMessageStorageOnStartup = jasperfx.ActiveProfile.ResourceAutoCreate; } } + + public void RegisterMessageType(Type messageType, string messageAlias) + { + HandlerGraph.RegisterMessageType(messageType, messageAlias); + } } \ No newline at end of file