📄 MatDenDagen/SmsSenderServiceExtensions.cs
using System;
using System.ComponentModel.DataAnnotations;
using HuaweiWifiSms.Grpc;
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Options;

namespace MatDenDagen;

public static class SmsSenderServiceExtensions
{
    public static IServiceCollection AddSmsSenderClient(this IServiceCollection services)
    {
        services.AddOptions<SmsSenderOptions>().BindConfiguration("SmsSender").ValidateOnStart();
        services.AddTransient<IValidateOptions<SmsSenderOptions>, SmsSenderOptionsValidator>();

        services
            .AddGrpcClient<SmsSender.SmsSenderClient>()
            .ConfigureHttpClient(
                (sp, client) =>
                    client.BaseAddress = sp.GetRequiredService<IOptions<SmsSenderOptions>>().Value.BaseAddress
            )
            .AddStandardResilienceHandler(options =>
            {
                var timeout = TimeSpan.FromSeconds(120);
                options.AttemptTimeout.Timeout = options.TotalRequestTimeout.Timeout = timeout;
                options.CircuitBreaker.SamplingDuration = timeout * 2;
            });

        return services;
    }
}

public sealed class SmsSenderOptions
{
    [Required]
    public required Uri BaseAddress { get; init; }
}

[OptionsValidator]
public sealed partial class SmsSenderOptionsValidator : IValidateOptions<SmsSenderOptions>;