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();
}
}
}