S8MonitoringDataProviderRegistry.cs 2.7 KB

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