From 59315c3fae51c7ee69778de76fcc8b93a6ccdf62 Mon Sep 17 00:00:00 2001 From: Kaliumhexacyanoferrat Date: Wed, 21 Feb 2024 14:44:29 +0100 Subject: [PATCH] Allow to pass serialization and injection factories for web services --- Modules/Webservices/Extensions.cs | 32 ++++++++-- .../Modules/Webservices/ExtensionTests.cs | 58 +++++++++++++++++++ 2 files changed, 86 insertions(+), 4 deletions(-) create mode 100644 Testing/Acceptance/Modules/Webservices/ExtensionTests.cs diff --git a/Modules/Webservices/Extensions.cs b/Modules/Webservices/Extensions.cs index 97440fca..846d1454 100644 --- a/Modules/Webservices/Extensions.cs +++ b/Modules/Webservices/Extensions.cs @@ -1,6 +1,11 @@ using System.Diagnostics.CodeAnalysis; +using GenHTTP.Api.Infrastructure; + +using GenHTTP.Modules.Conversion.Providers; using GenHTTP.Modules.Layouting.Provider; +using GenHTTP.Modules.Reflection.Injectors; +using GenHTTP.Modules.Webservices.Provider; namespace GenHTTP.Modules.Webservices { @@ -17,9 +22,11 @@ public static class Extensions /// /// The type of the resource to be added /// The path the resource should be available at - public static LayoutBuilder AddService<[DynamicallyAccessedMembers(DynamicallyAccessedMemberTypes.All)] T>(this LayoutBuilder layout, string path) where T : new() + /// Optionally the injectors to be used by this service + /// Optionally the formats to be used by this service + public static LayoutBuilder AddService<[DynamicallyAccessedMembers(DynamicallyAccessedMemberTypes.All)] T>(this LayoutBuilder layout, string path, IBuilder? injectors = null, IBuilder? formats = null) where T : new() { - return layout.Add(path, ServiceResource.From()); + return layout.Add(path, ServiceResource.From().Configured(injectors, formats)); } /// @@ -28,9 +35,26 @@ public static class Extensions /// /// The path the resource should be available at /// The webservice resource instance - public static LayoutBuilder AddService(this LayoutBuilder layout, string path, object instance) + /// Optionally the injectors to be used by this service + /// Optionally the formats to be used by this service + public static LayoutBuilder AddService(this LayoutBuilder layout, string path, object instance, IBuilder? injectors = null, IBuilder? formats = null) + { + return layout.Add(path, ServiceResource.From(instance).Configured(injectors, formats)); + } + + private static ServiceResourceBuilder Configured(this ServiceResourceBuilder builder, IBuilder? injectors = null, IBuilder? formats = null) { - return layout.Add(path, ServiceResource.From(instance)); + if (injectors != null) + { + builder.Injectors(injectors); + } + + if (formats != null) + { + builder.Formats(formats); + } + + return builder; } } diff --git a/Testing/Acceptance/Modules/Webservices/ExtensionTests.cs b/Testing/Acceptance/Modules/Webservices/ExtensionTests.cs new file mode 100644 index 00000000..b65a5dd2 --- /dev/null +++ b/Testing/Acceptance/Modules/Webservices/ExtensionTests.cs @@ -0,0 +1,58 @@ +using System.Net; +using System.Threading.Tasks; + +using GenHTTP.Modules.Conversion; +using GenHTTP.Modules.Layouting; +using GenHTTP.Modules.Reflection; +using GenHTTP.Modules.Webservices; + +using Microsoft.VisualStudio.TestTools.UnitTesting; + +namespace GenHTTP.Testing.Acceptance.Modules.Webservices +{ + + [TestClass] + public sealed class ExtensionTests + { + + #region Supporting data structures + + public class TestService + { + + [ResourceMethod] + public int DoWork() => 42; + + } + + #endregion + + #region Tests + + [TestMethod] + public async Task TestConfiguration() + { + var injectors = Injection.Default(); + + var formats = Serialization.Default(); + + var app = Layout.Create() + .AddService("by-type", injectors, formats) + .AddService("by-instance", new TestService(), injectors, formats); + + using var host = TestHost.Run(app); + + using var r1 = await host.GetResponseAsync("/by-type"); + + await r1.AssertStatusAsync(HttpStatusCode.OK); + + using var r2 = await host.GetResponseAsync("/by-instance"); + + await r2.AssertStatusAsync(HttpStatusCode.OK); + } + + #endregion + + } + +}