S8DatasetCatalog.cs 2.9 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970
  1. namespace Admin.NET.Plugin.AiDOP.Service.S8.Rules.DataAccess;
  2. /// <summary>数据集目录:回答"系统里有没有这个数据集、它是什么"。不回答"谁供数"。</summary>
  3. public interface IS8DatasetCatalog
  4. {
  5. /// <summary>该编码是否已定义。</summary>
  6. bool IsDefined(string? datasetCode);
  7. /// <summary>取定义;未定义返回 null。</summary>
  8. S8DatasetDefinition? Find(string? datasetCode);
  9. /// <summary>全部已定义数据集。</summary>
  10. IReadOnlyCollection<S8DatasetDefinition> All { get; }
  11. }
  12. /// <summary>
  13. /// 默认目录实现:聚合所有 <see cref="IS8DatasetDefinitionSource"/>。
  14. ///
  15. /// 与 <see cref="S8MonitoringDataProviderRegistry"/> 的分工:
  16. /// Catalog → Dataset 是什么(定义、种类、能力、是否停用)
  17. /// Registry → 当前哪个 Provider 实现它(运行时供数)
  18. ///
  19. /// Batch 1 曾把两者合一("注册即目录"),导致"数据集不存在"与"Provider 未实现"
  20. /// 无法区分。本批拆开后,规则可以在 Provider 上线前先配置好。
  21. /// </summary>
  22. public class S8DatasetCatalog : IS8DatasetCatalog, ITransient
  23. {
  24. private readonly Dictionary<string, S8DatasetDefinition> _definitions;
  25. public S8DatasetCatalog(IEnumerable<IS8DatasetDefinitionSource> sources)
  26. {
  27. _definitions = new Dictionary<string, S8DatasetDefinition>(StringComparer.OrdinalIgnoreCase);
  28. foreach (var source in sources)
  29. {
  30. foreach (var definition in source.GetDefinitions())
  31. {
  32. if (string.IsNullOrWhiteSpace(definition.DatasetCode)) continue;
  33. var code = definition.DatasetCode.Trim();
  34. // 重复定义视为配置错误:静默取其一会让实际生效的能力声明不可预测。
  35. if (_definitions.ContainsKey(code))
  36. {
  37. throw new InvalidOperationException(
  38. $"数据集 {code} 被重复定义(来源包含 {source.GetType().Name})");
  39. }
  40. if (!S8DatasetKind.IsKnown(definition.Kind))
  41. throw new InvalidOperationException($"数据集 {code} 的 Kind 非法:{definition.Kind}");
  42. if (!S8DatasetStatus.IsDeclarable(definition.Status))
  43. throw new InvalidOperationException($"数据集 {code} 的 Status 非法:{definition.Status}");
  44. _definitions[code] = definition;
  45. }
  46. }
  47. }
  48. public IReadOnlyCollection<S8DatasetDefinition> All => _definitions.Values;
  49. public bool IsDefined(string? datasetCode) =>
  50. !string.IsNullOrWhiteSpace(datasetCode) && _definitions.ContainsKey(datasetCode!.Trim());
  51. public S8DatasetDefinition? Find(string? datasetCode)
  52. {
  53. if (string.IsNullOrWhiteSpace(datasetCode)) return null;
  54. return _definitions.TryGetValue(datasetCode.Trim(), out var definition) ? definition : null;
  55. }
  56. }