diff --git a/src/ServiceComposer.AspNetCore.Endpoints.Tests/Get_with_2_handlers.cs b/src/ServiceComposer.AspNetCore.Endpoints.Tests/Get_with_2_handlers.cs index 249b1f51..f0cdc430 100644 --- a/src/ServiceComposer.AspNetCore.Endpoints.Tests/Get_with_2_handlers.cs +++ b/src/ServiceComposer.AspNetCore.Endpoints.Tests/Get_with_2_handlers.cs @@ -11,6 +11,7 @@ namespace ServiceComposer.AspNetCore.Endpoints.Tests { public class Get_with_2_handlers { + [Route("sample")] class TestGetIntegerHandler : ICompositionRequestsHandler { class Model @@ -18,7 +19,7 @@ class Model [FromRoute]public int id { get; set; } } - [HttpGet("/sample/{id}")] + [HttpGet("{id}")] public async Task Handle(HttpRequest request) { var model = await request.Bind(); @@ -27,9 +28,10 @@ public async Task Handle(HttpRequest request) } } + [Route("sample")] class TestGetStringHandler : ICompositionRequestsHandler { - [HttpGet("/sample/{id}")] + [HttpGet("{id}")] public Task Handle(HttpRequest request) { var vm = request.GetComposedResponseModel(); diff --git a/src/ServiceComposer.AspNetCore/EndpointsExtensions.cs b/src/ServiceComposer.AspNetCore/EndpointsExtensions.cs index 36c488bc..d9dc9e3b 100644 --- a/src/ServiceComposer.AspNetCore/EndpointsExtensions.cs +++ b/src/ServiceComposer.AspNetCore/EndpointsExtensions.cs @@ -213,8 +213,9 @@ private static CompositionEndpointBuilder CreateCompositionEndpointBuilder( }; builder.Metadata.Add(methodMetadata); - var attributes = componentsGroup.SelectMany(component => component.Method.GetCustomAttributes()); - foreach (var attribute in attributes) + var methodAttributes = componentsGroup.SelectMany(component => component.Method.GetCustomAttributes()); + var classAttributes = componentsGroup.SelectMany(component => component.ComponentType.GetCustomAttributes()); + foreach (var attribute in methodAttributes.Concat(classAttributes)) { builder.Metadata.Add(attribute); } @@ -229,13 +230,17 @@ private static CompositionEndpointBuilder CreateCompositionEndpointBuilder( .Select(componentType => { var method = ExtractMethod(componentType); - var template = method.GetCustomAttribute()?.Template.TrimStart('/'); - if (template != null && useCaseInsensitiveRouteMatching) + var template = method.GetCustomAttribute()?.Template; + if (template != null) { - template = template.ToLowerInvariant(); + template = PrefixWithRouteTemplateIfAny(componentType, template); + if (useCaseInsensitiveRouteMatching) + { + template = template.ToLowerInvariant(); + } } - return (componentType, method, template); + return (componentType, method, template?.TrimStart('/')); }) .Where(component => component.Template != null) .GroupBy(component => component.Template); @@ -243,6 +248,22 @@ private static CompositionEndpointBuilder CreateCompositionEndpointBuilder( return getComponentsGroupedByTemplate; } + static string PrefixWithRouteTemplateIfAny(Type componentType, string template) + { + if (template.StartsWith('/') || template.StartsWith("~/")) + { + return template; + } + + var routeTemplate = componentType.GetCustomAttribute()?.Template; + if (routeTemplate == null) + { + return template; + } + + return string.Concat(routeTemplate, "/", template); + } + static MethodInfo ExtractMethod(Type componentType) { if (typeof(ICompositionRequestsHandler).IsAssignableFrom(componentType))