using System; using System.Linq; using Microsoft.Extensions.Configuration; namespace ZB.MOM.WW.LmxProxy.Client { /// /// Factory interface for creating LmxProxyClient instances /// public interface ILmxProxyClientFactory { /// /// Creates a new LmxProxyClient instance with default configuration /// /// A configured LmxProxyClient instance LmxProxyClient CreateClient(); /// /// Creates a new LmxProxyClient instance with custom configuration /// /// Name of the configuration section to use /// A configured LmxProxyClient instance LmxProxyClient CreateClient(string configurationName); /// /// Creates a new LmxProxyClient instance using a builder /// /// Action to configure the builder /// A configured LmxProxyClient instance LmxProxyClient CreateClient(Action builderAction); } /// /// Default implementation of ILmxProxyClientFactory /// public class LmxProxyClientFactory : ILmxProxyClientFactory { private readonly IConfiguration _configuration; /// /// Initializes a new instance of the LmxProxyClientFactory /// /// Application configuration public LmxProxyClientFactory(IConfiguration configuration) { _configuration = configuration ?? throw new ArgumentNullException(nameof(configuration)); } /// /// Creates a new LmxProxyClient instance with default configuration /// /// A configured LmxProxyClient instance public LmxProxyClient CreateClient() { return CreateClient("LmxProxy"); } /// /// Creates a new LmxProxyClient instance with custom configuration /// /// Name of the configuration section to use /// A configured LmxProxyClient instance public LmxProxyClient CreateClient(string configurationName) { IConfigurationSection section = _configuration.GetSection(configurationName); if (!section.GetChildren().Any() && section.Value == null) { throw new InvalidOperationException($"Configuration section '{configurationName}' not found"); } var builder = new LmxProxyClientBuilder(); // Configure from appsettings string? host = section["Host"]; if (!string.IsNullOrEmpty(host)) { builder.WithHost(host); } if (int.TryParse(section["Port"], out int port)) { builder.WithPort(port); } string? apiKey = section["ApiKey"]; if (!string.IsNullOrEmpty(apiKey)) { builder.WithApiKey(apiKey); } if (TimeSpan.TryParse(section["Timeout"], out TimeSpan timeout)) { builder.WithTimeout(timeout); } // Retry configuration IConfigurationSection? retrySection = section.GetSection("Retry"); if (retrySection != null && (retrySection.GetChildren().Any() || retrySection.Value != null)) { if (int.TryParse(retrySection["MaxAttempts"], out int maxAttempts) && TimeSpan.TryParse(retrySection["Delay"], out TimeSpan retryDelay)) { builder.WithRetryPolicy(maxAttempts, retryDelay); } } // SSL configuration bool useSsl = section.GetValue("UseSsl"); if (useSsl) { string? certificatePath = section["CertificatePath"]; builder.WithSslCredentials(certificatePath); } // Metrics configuration if (section.GetValue("EnableMetrics")) { builder.WithMetrics(); } // Correlation ID configuration string? correlationHeader = section["CorrelationIdHeader"]; if (!string.IsNullOrEmpty(correlationHeader)) { builder.WithCorrelationIdHeader(correlationHeader); } // Logger is optional - don't set a default one return builder.Build(); } /// /// Creates a new LmxProxyClient instance using a builder /// /// Action to configure the builder /// A configured LmxProxyClient instance public LmxProxyClient CreateClient(Action builderAction) { ArgumentNullException.ThrowIfNull(builderAction); var builder = new LmxProxyClientBuilder(); builderAction(builder); // Logger is optional - caller can set it via builderAction if needed return builder.Build(); } } }