feat(dcl): Layer D OpcUaGlobalOptions for app-wide identity + cert paths

New deployment-wide options bound from the "OpcUa" section of appsettings.json:
- ApplicationName (default "ScadaLink-DCL")
- TrustedIssuerStorePath / TrustedPeerStorePath / RejectedCertificateStorePath

Empty paths fall back to Path.GetTempPath()/ScadaLink/pki/* so dev runs work
without explicit config — same defaults the hardcoded values previously used.

Wiring:
- ServiceCollectionExtensions binds OpcUaGlobalOptions to the OpcUa section.
- DataConnectionFactory takes IOptions<OpcUaGlobalOptions> and constructs
  RealOpcUaClientFactory with the snapshot.
- RealOpcUaClient(globalOptions) replaces the hardcoded ApplicationName and
  the three CertificateTrustList store paths in ApplicationConfiguration.
- Parameterless ctors on factory and client preserved for the existing test
  suite (32/32 DCL tests still green).
This commit is contained in:
Joseph Doherty
2026-05-12 02:27:58 -04:00
parent e6a5b558f3
commit 8faaa8fe2b
4 changed files with 51 additions and 6 deletions

View File

@@ -1,4 +1,5 @@
using Microsoft.Extensions.Logging;
using Microsoft.Extensions.Options;
using ScadaLink.Commons.Interfaces.Protocol;
using ScadaLink.DataConnectionLayer.Adapters;
@@ -14,12 +15,17 @@ public class DataConnectionFactory : IDataConnectionFactory
private readonly ILoggerFactory _loggerFactory;
public DataConnectionFactory(ILoggerFactory loggerFactory)
: this(loggerFactory, Options.Create(new OpcUaGlobalOptions())) { }
public DataConnectionFactory(ILoggerFactory loggerFactory, IOptions<OpcUaGlobalOptions> opcUaGlobalOptions)
{
_loggerFactory = loggerFactory;
var globalOptions = opcUaGlobalOptions.Value;
// Register built-in protocols
RegisterAdapter("OpcUa", details => new OpcUaDataConnection(
new RealOpcUaClientFactory(), _loggerFactory.CreateLogger<OpcUaDataConnection>()));
new RealOpcUaClientFactory(globalOptions),
_loggerFactory.CreateLogger<OpcUaDataConnection>()));
}
/// <summary>