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