Files
viewengine.client/Extensions/ServiceCollectionExtensions.cs

68 lines
2.8 KiB
C#

using Microsoft.Extensions.Configuration;
using Microsoft.Extensions.DependencyInjection;
using ViewEngine.Client.Configuration;
namespace ViewEngine.Client.Extensions;
/// <summary>
/// Extension methods for registering ViewEngine client services
/// </summary>
public static class ServiceCollectionExtensions
{
/// <summary>
/// Adds ViewEngine client services to the dependency injection container
/// </summary>
/// <param name="services">The service collection</param>
/// <param name="configuration">The configuration</param>
/// <returns>The service collection for chaining</returns>
public static IServiceCollection AddViewEngineClient(this IServiceCollection services, IConfiguration configuration)
{
// Bind configuration
services.Configure<ViewEngineOptions>(configuration.GetSection(ViewEngineOptions.SectionName));
// Register the client as a typed HttpClient
services.AddHttpClient<ViewEngineClient>((serviceProvider, httpClient) =>
{
var options = configuration.GetSection(ViewEngineOptions.SectionName).Get<ViewEngineOptions>()
?? throw new InvalidOperationException("ViewEngine configuration is missing");
if (string.IsNullOrWhiteSpace(options.ApiKey))
throw new InvalidOperationException("ViewEngine API key is required");
httpClient.BaseAddress = new Uri(options.BaseUrl);
httpClient.Timeout = TimeSpan.FromSeconds(options.TimeoutSeconds);
httpClient.DefaultRequestHeaders.Add("X-API-Key", options.ApiKey);
});
return services;
}
/// <summary>
/// Adds ViewEngine client services to the dependency injection container with custom configuration
/// </summary>
/// <param name="services">The service collection</param>
/// <param name="configureOptions">Action to configure options</param>
/// <returns>The service collection for chaining</returns>
public static IServiceCollection AddViewEngineClient(this IServiceCollection services, Action<ViewEngineOptions> configureOptions)
{
// Configure options
services.Configure(configureOptions);
// Register the client as a typed HttpClient
services.AddHttpClient<ViewEngineClient>((serviceProvider, httpClient) =>
{
var options = new ViewEngineOptions();
configureOptions(options);
if (string.IsNullOrWhiteSpace(options.ApiKey))
throw new InvalidOperationException("ViewEngine API key is required");
httpClient.BaseAddress = new Uri(options.BaseUrl);
httpClient.Timeout = TimeSpan.FromSeconds(options.TimeoutSeconds);
httpClient.DefaultRequestHeaders.Add("X-API-Key", options.ApiKey);
});
return services;
}
}