using Microsoft.Extensions.Configuration; namespace ZB.MOM.WW.LmxProxy.Client; /// /// Factory for creating instances. /// public interface ILmxProxyClientFactory { /// Creates a client from the default "LmxProxy" configuration section. LmxProxyClient CreateClient(); /// Creates a client from a named configuration section. LmxProxyClient CreateClient(string configName); /// Creates a client using a builder configuration action. LmxProxyClient CreateClient(Action builderAction); } /// /// Default implementation of that reads from IConfiguration. /// public class LmxProxyClientFactory : ILmxProxyClientFactory { private readonly IConfiguration _configuration; /// Creates a new factory with the specified configuration. public LmxProxyClientFactory(IConfiguration configuration) { _configuration = configuration ?? throw new ArgumentNullException(nameof(configuration)); } /// public LmxProxyClient CreateClient() => CreateClient("LmxProxy"); /// public LmxProxyClient CreateClient(string configName) { IConfigurationSection section = _configuration.GetSection(configName); var options = new LmxProxyClientOptions(); section.Bind(options); return BuildFromOptions(options); } /// public LmxProxyClient CreateClient(Action builderAction) { var builder = new LmxProxyClientBuilder(); builderAction(builder); return builder.Build(); } private static LmxProxyClient BuildFromOptions(LmxProxyClientOptions options) { var builder = new LmxProxyClientBuilder() .WithHost(options.Host) .WithPort(options.Port) .WithTimeout(options.Timeout) .WithRetryPolicy(options.Retry.MaxAttempts, options.Retry.Delay); if (!string.IsNullOrEmpty(options.ApiKey)) builder.WithApiKey(options.ApiKey); if (options.EnableMetrics) builder.WithMetrics(); if (!string.IsNullOrEmpty(options.CorrelationIdHeader)) builder.WithCorrelationIdHeader(options.CorrelationIdHeader); if (options.UseSsl) { builder.WithTlsConfiguration(new ClientTlsConfiguration { UseTls = true, ServerCaCertificatePath = options.CertificatePath }); } return builder.Build(); } }