From c6c1decd2a20bf682f901f841ee57ab43fe3be64 Mon Sep 17 00:00:00 2001 From: TekH Date: Wed, 24 Jun 2026 10:01:19 +0200 Subject: [PATCH] Refactor to use IHttpClientFactory and remove ApiOptions Replaced direct injection of HttpClient with IHttpClientFactory across the codebase to improve HTTP client management and align with best practices. Removed dependency on ApiOptions and IOptions in multiple services, simplifying constructors and reducing configuration complexity. Updated FontLoader to use IHttpClientFactory for font loading with relative paths. Adjusted comments and documentation to reflect these changes. Cleaned up unused using directives related to ApiOptions. --- .../Layout/MainLayout.razor | 5 +++-- .../Services/AnnotationService.cs | 10 ++-------- .../Services/AuthService.cs | 5 +---- .../Services/DocumentService.cs | 5 +---- .../Services/EnvelopeReceiverService.cs | 6 ++---- .../Services/FontLoader.cs | 13 +++++++++---- .../Services/SignatureCacheService.cs | 5 +---- .../Services/SignatureService.cs | 4 +--- 8 files changed, 20 insertions(+), 33 deletions(-) diff --git a/EnvelopeGenerator.Server/EnvelopeGenerator.Server.Client/Layout/MainLayout.razor b/EnvelopeGenerator.Server/EnvelopeGenerator.Server.Client/Layout/MainLayout.razor index 11582efb..433431d7 100644 --- a/EnvelopeGenerator.Server/EnvelopeGenerator.Server.Client/Layout/MainLayout.razor +++ b/EnvelopeGenerator.Server/EnvelopeGenerator.Server.Client/Layout/MainLayout.razor @@ -15,13 +15,14 @@ @code { - [Inject] HttpClient Http { get; set; } + [Inject] IHttpClientFactory HttpClientFactory { get; set; } = default!; + List RequiredFonts = new() { "opensans.ttf" }; protected async override Task OnInitializedAsync() { - await FontLoader.LoadFonts(Http, RequiredFonts); + await FontLoader.LoadFonts(HttpClientFactory, RequiredFonts); await base.OnInitializedAsync(); } } \ No newline at end of file diff --git a/EnvelopeGenerator.Server/EnvelopeGenerator.Server.Client/Services/AnnotationService.cs b/EnvelopeGenerator.Server/EnvelopeGenerator.Server.Client/Services/AnnotationService.cs index 693e4c6a..fd9e7556 100644 --- a/EnvelopeGenerator.Server/EnvelopeGenerator.Server.Client/Services/AnnotationService.cs +++ b/EnvelopeGenerator.Server/EnvelopeGenerator.Server.Client/Services/AnnotationService.cs @@ -2,21 +2,15 @@ using System.Net.Http; using System.Net.Http.Json; using System.Text.Json; using EnvelopeGenerator.Server.Client.Models; -using EnvelopeGenerator.Server.Client.Options; -using Microsoft.Extensions.Options; namespace EnvelopeGenerator.Server.Client.Services; /// /// Retrieves annotation positions from the API. -/// The URL is composed as {BaseUrl}/api/Annotation/{envelopeKey}. -/// During development, BaseUrl is empty so the request resolves to the -/// YARP-proxied route on the same origin, which currently serves -/// fake-data/annotations.json. To switch to real data, update the -/// YARP route in yarp.json — no code change required. +/// Uses relative paths (/api/Annotation/{envelopeKey}). /// [Obsolete("Use SignatureService.")] -public class AnnotationService(IHttpClientFactory httpClientFactory, IOptions apiOptions) +public class AnnotationService(IHttpClientFactory httpClientFactory) { private static readonly JsonSerializerOptions _jsonOptions = new(JsonSerializerDefaults.Web); diff --git a/EnvelopeGenerator.Server/EnvelopeGenerator.Server.Client/Services/AuthService.cs b/EnvelopeGenerator.Server/EnvelopeGenerator.Server.Client/Services/AuthService.cs index ba23d283..12db705b 100644 --- a/EnvelopeGenerator.Server/EnvelopeGenerator.Server.Client/Services/AuthService.cs +++ b/EnvelopeGenerator.Server/EnvelopeGenerator.Server.Client/Services/AuthService.cs @@ -1,8 +1,6 @@ using System.Net; using System.Net.Http; using System.Net.Http.Json; -using EnvelopeGenerator.Server.Client.Options; -using Microsoft.Extensions.Options; namespace EnvelopeGenerator.Server.Client.Services; @@ -10,9 +8,8 @@ public enum EnvelopeLoginResult { Success, InvalidCode, NotFound, Error } public enum SenderLoginResult { Success, InvalidCredentials, Error } -public class AuthService(IHttpClientFactory httpClientFactory, IOptions apiOptions) +public class AuthService(IHttpClientFactory httpClientFactory) { - private readonly ApiOptions _api = apiOptions.Value; /// /// Checks whether the current user holds a valid receiver token for the given envelope key. diff --git a/EnvelopeGenerator.Server/EnvelopeGenerator.Server.Client/Services/DocumentService.cs b/EnvelopeGenerator.Server/EnvelopeGenerator.Server.Client/Services/DocumentService.cs index f552033f..ff649c3c 100644 --- a/EnvelopeGenerator.Server/EnvelopeGenerator.Server.Client/Services/DocumentService.cs +++ b/EnvelopeGenerator.Server/EnvelopeGenerator.Server.Client/Services/DocumentService.cs @@ -1,13 +1,10 @@ using System.Net; using System.Net.Http; -using Microsoft.Extensions.Options; -using EnvelopeGenerator.Server.Client.Options; namespace EnvelopeGenerator.Server.Client.Services; -public class DocumentService(IHttpClientFactory httpClientFactory, IOptions apiOptions) +public class DocumentService(IHttpClientFactory httpClientFactory) { - private readonly ApiOptions _api = apiOptions.Value; /// /// Fetches the PDF bytes for the given envelope key from the API. diff --git a/EnvelopeGenerator.Server/EnvelopeGenerator.Server.Client/Services/EnvelopeReceiverService.cs b/EnvelopeGenerator.Server/EnvelopeGenerator.Server.Client/Services/EnvelopeReceiverService.cs index 852fb877..89917286 100644 --- a/EnvelopeGenerator.Server/EnvelopeGenerator.Server.Client/Services/EnvelopeReceiverService.cs +++ b/EnvelopeGenerator.Server/EnvelopeGenerator.Server.Client/Services/EnvelopeReceiverService.cs @@ -3,16 +3,14 @@ using System.Net.Http; using System.Net.Http.Json; using System.Text.Json; using EnvelopeGenerator.Server.Client.Models; -using EnvelopeGenerator.Server.Client.Options; -using Microsoft.Extensions.Options; namespace EnvelopeGenerator.Server.Client.Services; /// /// Retrieves the for the authenticated receiver -/// from GET api/EnvelopeReceiver/{envelopeKey}. +/// from GET /api/EnvelopeReceiver/{envelopeKey}. /// -public class EnvelopeReceiverService(IHttpClientFactory httpClientFactory, IOptions apiOptions) +public class EnvelopeReceiverService(IHttpClientFactory httpClientFactory) { private static readonly JsonSerializerOptions _jsonOptions = new(JsonSerializerDefaults.Web); diff --git a/EnvelopeGenerator.Server/EnvelopeGenerator.Server.Client/Services/FontLoader.cs b/EnvelopeGenerator.Server/EnvelopeGenerator.Server.Client/Services/FontLoader.cs index 8db77818..96f6ce60 100644 --- a/EnvelopeGenerator.Server/EnvelopeGenerator.Server.Client/Services/FontLoader.cs +++ b/EnvelopeGenerator.Server/EnvelopeGenerator.Server.Client/Services/FontLoader.cs @@ -2,10 +2,15 @@ namespace EnvelopeGenerator.Server.Client.Services; -public static class FontLoader { - public async static Task LoadFonts(HttpClient httpClient, List fontNames) { - foreach(var fontName in fontNames) { - var fontBytes = await httpClient.GetByteArrayAsync($"fonts/{fontName}"); +public static class FontLoader +{ + public static async Task LoadFonts(IHttpClientFactory httpClientFactory, List fontNames) + { + using var httpClient = httpClientFactory.CreateClient("EnvelopeGenerator.Server"); + + foreach (var fontName in fontNames) + { + var fontBytes = await httpClient.GetByteArrayAsync($"/fonts/{fontName}"); DXFontRepository.Instance.AddFont(fontBytes); } } diff --git a/EnvelopeGenerator.Server/EnvelopeGenerator.Server.Client/Services/SignatureCacheService.cs b/EnvelopeGenerator.Server/EnvelopeGenerator.Server.Client/Services/SignatureCacheService.cs index 6243f3ef..5478a23d 100644 --- a/EnvelopeGenerator.Server/EnvelopeGenerator.Server.Client/Services/SignatureCacheService.cs +++ b/EnvelopeGenerator.Server/EnvelopeGenerator.Server.Client/Services/SignatureCacheService.cs @@ -1,7 +1,5 @@ using System.Net.Http; using System.Net.Http.Json; -using Microsoft.Extensions.Options; -using EnvelopeGenerator.Server.Client.Options; using EnvelopeGenerator.Server.Client.Models; namespace EnvelopeGenerator.Server.Client.Services; @@ -9,9 +7,8 @@ namespace EnvelopeGenerator.Server.Client.Services; /// /// Client service for managing cached signatures via API. /// -public class SignatureCacheService(IHttpClientFactory httpClientFactory, IOptions apiOptions) +public class SignatureCacheService(IHttpClientFactory httpClientFactory) { - private readonly ApiOptions _api = apiOptions.Value; public async Task SaveSignatureAsync( string envelopeKey, diff --git a/EnvelopeGenerator.Server/EnvelopeGenerator.Server.Client/Services/SignatureService.cs b/EnvelopeGenerator.Server/EnvelopeGenerator.Server.Client/Services/SignatureService.cs index 9fd76a62..a8f76d22 100644 --- a/EnvelopeGenerator.Server/EnvelopeGenerator.Server.Client/Services/SignatureService.cs +++ b/EnvelopeGenerator.Server/EnvelopeGenerator.Server.Client/Services/SignatureService.cs @@ -2,12 +2,10 @@ using System.Net.Http; using System.Net.Http.Json; using System.Text.Json; using EnvelopeGenerator.Server.Client.Models; -using EnvelopeGenerator.Server.Client.Options; -using Microsoft.Extensions.Options; namespace EnvelopeGenerator.Server.Client.Services; -public class SignatureService(IHttpClientFactory httpClientFactory, IOptions apiOptions) +public class SignatureService(IHttpClientFactory httpClientFactory) { private static readonly JsonSerializerOptions _jsonOptions = new(JsonSerializerDefaults.Web);