namespace Admin.NET.Plugin.AiDOP.Service.S8.Rules.DataAccess; /// /// DatasetCode → Provider 解析注册表。 /// /// 采用"注册即目录"的设计:一个 DatasetCode 被视为存在,当且仅当有 Provider 为它注册。 /// 这样避免维护一份独立的 dataset 目录再与实现漂移——目录与实现天然一致。 /// /// 本批(S8-DATASET-PROVIDER-FOUNDATION-1)**不注册任何生产 Provider**: /// 字段级审计显示 6 个候选标准数据集全部为 READY_WITH_PLATFORM_GAP, /// 在数据平台补齐数据集级新鲜度判定之前不接生产数据集。 /// 因此当前 为空是预期状态,不是缺陷。 /// public class S8MonitoringDataProviderRegistry : ITransient { private readonly Dictionary _providers; public S8MonitoringDataProviderRegistry(IEnumerable providers) { _providers = new Dictionary(StringComparer.OrdinalIgnoreCase); foreach (var provider in providers) { if (string.IsNullOrWhiteSpace(provider.DatasetCode)) continue; // 同一 DatasetCode 重复注册视为配置错误:静默取其一会让实际生效的实现不可预测。 if (_providers.ContainsKey(provider.DatasetCode)) { throw new InvalidOperationException( $"数据集 {provider.DatasetCode} 注册了多个 Provider:" + $"{_providers[provider.DatasetCode].GetType().Name} 与 {provider.GetType().Name}"); } _providers[provider.DatasetCode.Trim()] = provider; } } /// 已注册的数据集编码。 public IReadOnlyCollection RegisteredDatasetCodes => _providers.Keys; /// 该数据集编码是否已有 Provider。规则校验用。 public bool IsRegistered(string? datasetCode) => !string.IsNullOrWhiteSpace(datasetCode) && _providers.ContainsKey(datasetCode!.Trim()); /// 解析 Provider;未注册时显式失败,不回落 Legacy SQL。 public IS8MonitoringDataProvider Resolve(string? datasetCode) { if (string.IsNullOrWhiteSpace(datasetCode)) throw new S8RuleEvaluatorException( "dataset_code_missing", "STANDARD_DATASET 模式的规则必须提供 dataset_code"); if (!_providers.TryGetValue(datasetCode.Trim(), out var provider)) throw new S8RuleEvaluatorException( "dataset_provider_not_registered", $"数据集 {datasetCode} 没有已注册的 Provider"); return provider; } }