using ZB.MOM.WW.Configuration; namespace ZB.MOM.WW.ScadaBridge.DataConnectionLayer; /// /// Validates at startup (ValidateOnStart) so a /// malformed "ScadaBridge:DataConnection" appsettings section fails fast at boot with a /// key-naming message instead of surfacing later at runtime. The intervals drive /// the reconnect/tag-resolution timers and the seed-read retry loop; a /// zero/negative duration (or a non-positive SeedReadMaxAttempts) would /// otherwise produce an opaque failure far from the offending config key. /// public sealed class DataConnectionOptionsValidator : OptionsValidatorBase { /// protected override void Validate(ValidationBuilder builder, DataConnectionOptions options) { builder.RequireThat(options.ReconnectInterval > TimeSpan.Zero, $"ScadaBridge:DataConnection:ReconnectInterval must be a positive duration (was {options.ReconnectInterval})."); builder.RequireThat(options.TagResolutionRetryInterval > TimeSpan.Zero, $"ScadaBridge:DataConnection:TagResolutionRetryInterval must be a positive duration (was {options.TagResolutionRetryInterval})."); builder.RequireThat(options.WriteTimeout > TimeSpan.Zero, $"ScadaBridge:DataConnection:WriteTimeout must be a positive duration (was {options.WriteTimeout})."); builder.RequireThat(options.SeedReadTimeout > TimeSpan.Zero, $"ScadaBridge:DataConnection:SeedReadTimeout must be a positive duration (was {options.SeedReadTimeout})."); builder.RequireThat(options.StableConnectionThreshold > TimeSpan.Zero, $"ScadaBridge:DataConnection:StableConnectionThreshold must be a positive duration (was {options.StableConnectionThreshold})."); builder.RequireThat(options.SeedReadRetryDelay > TimeSpan.Zero, $"ScadaBridge:DataConnection:SeedReadRetryDelay must be a positive duration (was {options.SeedReadRetryDelay})."); builder.RequireThat(options.SeedReadMaxAttempts > 0, $"ScadaBridge:DataConnection:SeedReadMaxAttempts must be positive (was {options.SeedReadMaxAttempts})."); builder.RequireThat(options.TagResolutionRetryMaxInterval >= options.TagResolutionRetryInterval, "ScadaBridge:DataConnection:TagResolutionRetryMaxInterval must be at least " + $"TagResolutionRetryInterval (was {options.TagResolutionRetryMaxInterval} vs {options.TagResolutionRetryInterval})."); builder.RequireThat(options.SubscribeBatchSize > 0, $"ScadaBridge:DataConnection:SubscribeBatchSize must be positive (was {options.SubscribeBatchSize})."); builder.RequireThat(options.SubscribeBatchDelay >= TimeSpan.Zero, $"ScadaBridge:DataConnection:SubscribeBatchDelay must not be negative (was {options.SubscribeBatchDelay})."); builder.RequireThat(options.SeedReadBatchSize > 0, $"ScadaBridge:DataConnection:SeedReadBatchSize must be positive (was {options.SeedReadBatchSize})."); builder.RequireThat(options.SeedReadMaxParallelism > 0, $"ScadaBridge:DataConnection:SeedReadMaxParallelism must be positive (was {options.SeedReadMaxParallelism})."); builder.RequireThat(options.SeedOverallTimeout > TimeSpan.Zero, $"ScadaBridge:DataConnection:SeedOverallTimeout must be a positive duration (was {options.SeedOverallTimeout})."); builder.RequireThat(options.QualityFlushInterval > TimeSpan.Zero, $"ScadaBridge:DataConnection:QualityFlushInterval must be a positive duration (was {options.QualityFlushInterval})."); builder.RequireThat(options.MxSupervisoryAdviseParallelism > 0, $"ScadaBridge:DataConnection:MxSupervisoryAdviseParallelism must be positive (was {options.MxSupervisoryAdviseParallelism})."); } }