| 1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859 |
- namespace Admin.NET.Plugin.AiDOP.Service.S8.Rules.DataAccess;
- /// <summary>
- /// DatasetCode → Provider 解析注册表。
- ///
- /// 采用"注册即目录"的设计:一个 DatasetCode 被视为存在,当且仅当有 Provider 为它注册。
- /// 这样避免维护一份独立的 dataset 目录再与实现漂移——目录与实现天然一致。
- ///
- /// 本批(S8-DATASET-PROVIDER-FOUNDATION-1)**不注册任何生产 Provider**:
- /// 字段级审计显示 6 个候选标准数据集全部为 READY_WITH_PLATFORM_GAP,
- /// 在数据平台补齐数据集级新鲜度判定之前不接生产数据集。
- /// 因此当前 <see cref="RegisteredDatasetCodes"/> 为空是预期状态,不是缺陷。
- /// </summary>
- public class S8MonitoringDataProviderRegistry : ITransient
- {
- private readonly Dictionary<string, IS8MonitoringDataProvider> _providers;
- public S8MonitoringDataProviderRegistry(IEnumerable<IS8MonitoringDataProvider> providers)
- {
- _providers = new Dictionary<string, IS8MonitoringDataProvider>(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;
- }
- }
- /// <summary>已注册的数据集编码。</summary>
- public IReadOnlyCollection<string> RegisteredDatasetCodes => _providers.Keys;
- /// <summary>该数据集编码是否已有 Provider。规则校验用。</summary>
- public bool IsRegistered(string? datasetCode) =>
- !string.IsNullOrWhiteSpace(datasetCode) && _providers.ContainsKey(datasetCode!.Trim());
- /// <summary>解析 Provider;未注册时显式失败,不回落 Legacy SQL。</summary>
- 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;
- }
- }
|