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<ApiOptions> 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.
This commit is contained in:
2026-06-24 10:01:19 +02:00
parent 0fdaa1a38d
commit c6c1decd2a
8 changed files with 20 additions and 33 deletions

View File

@@ -15,13 +15,14 @@
</div>
@code {
[Inject] HttpClient Http { get; set; }
[Inject] IHttpClientFactory HttpClientFactory { get; set; } = default!;
List<string> RequiredFonts = new() {
"opensans.ttf"
};
protected async override Task OnInitializedAsync() {
await FontLoader.LoadFonts(Http, RequiredFonts);
await FontLoader.LoadFonts(HttpClientFactory, RequiredFonts);
await base.OnInitializedAsync();
}
}

View File

@@ -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;
/// <summary>
/// Retrieves annotation positions from the API.
/// The URL is composed as <c>{BaseUrl}/api/Annotation/{envelopeKey}</c>.
/// During development, <c>BaseUrl</c> is empty so the request resolves to the
/// YARP-proxied route on the same origin, which currently serves
/// <c>fake-data/annotations.json</c>. To switch to real data, update the
/// YARP route in <c>yarp.json</c> — no code change required.
/// Uses relative paths (/api/Annotation/{envelopeKey}).
/// </summary>
[Obsolete("Use SignatureService.")]
public class AnnotationService(IHttpClientFactory httpClientFactory, IOptions<ApiOptions> apiOptions)
public class AnnotationService(IHttpClientFactory httpClientFactory)
{
private static readonly JsonSerializerOptions _jsonOptions = new(JsonSerializerDefaults.Web);

View File

@@ -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> apiOptions)
public class AuthService(IHttpClientFactory httpClientFactory)
{
private readonly ApiOptions _api = apiOptions.Value;
/// <summary>
/// Checks whether the current user holds a valid receiver token for the given envelope key.

View File

@@ -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> apiOptions)
public class DocumentService(IHttpClientFactory httpClientFactory)
{
private readonly ApiOptions _api = apiOptions.Value;
/// <summary>
/// Fetches the PDF bytes for the given envelope key from the API.

View File

@@ -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;
/// <summary>
/// Retrieves the <see cref="EnvelopeReceiverDto"/> for the authenticated receiver
/// from <c>GET api/EnvelopeReceiver/{envelopeKey}</c>.
/// from <c>GET /api/EnvelopeReceiver/{envelopeKey}</c>.
/// </summary>
public class EnvelopeReceiverService(IHttpClientFactory httpClientFactory, IOptions<ApiOptions> apiOptions)
public class EnvelopeReceiverService(IHttpClientFactory httpClientFactory)
{
private static readonly JsonSerializerOptions _jsonOptions = new(JsonSerializerDefaults.Web);

View File

@@ -2,10 +2,15 @@
namespace EnvelopeGenerator.Server.Client.Services;
public static class FontLoader {
public async static Task LoadFonts(HttpClient httpClient, List<string> 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<string> fontNames)
{
using var httpClient = httpClientFactory.CreateClient("EnvelopeGenerator.Server");
foreach (var fontName in fontNames)
{
var fontBytes = await httpClient.GetByteArrayAsync($"/fonts/{fontName}");
DXFontRepository.Instance.AddFont(fontBytes);
}
}

View File

@@ -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;
/// <summary>
/// Client service for managing cached signatures via API.
/// </summary>
public class SignatureCacheService(IHttpClientFactory httpClientFactory, IOptions<ApiOptions> apiOptions)
public class SignatureCacheService(IHttpClientFactory httpClientFactory)
{
private readonly ApiOptions _api = apiOptions.Value;
public async Task SaveSignatureAsync(
string envelopeKey,

View File

@@ -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> apiOptions)
public class SignatureService(IHttpClientFactory httpClientFactory)
{
private static readonly JsonSerializerOptions _jsonOptions = new(JsonSerializerDefaults.Web);