| 12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970 |
- namespace Admin.NET.Plugin.AiDOP.Service.S8.Rules.DataAccess;
- /// <summary>数据集目录:回答"系统里有没有这个数据集、它是什么"。不回答"谁供数"。</summary>
- public interface IS8DatasetCatalog
- {
- /// <summary>该编码是否已定义。</summary>
- bool IsDefined(string? datasetCode);
- /// <summary>取定义;未定义返回 null。</summary>
- S8DatasetDefinition? Find(string? datasetCode);
- /// <summary>全部已定义数据集。</summary>
- IReadOnlyCollection<S8DatasetDefinition> All { get; }
- }
- /// <summary>
- /// 默认目录实现:聚合所有 <see cref="IS8DatasetDefinitionSource"/>。
- ///
- /// 与 <see cref="S8MonitoringDataProviderRegistry"/> 的分工:
- /// Catalog → Dataset 是什么(定义、种类、能力、是否停用)
- /// Registry → 当前哪个 Provider 实现它(运行时供数)
- ///
- /// Batch 1 曾把两者合一("注册即目录"),导致"数据集不存在"与"Provider 未实现"
- /// 无法区分。本批拆开后,规则可以在 Provider 上线前先配置好。
- /// </summary>
- public class S8DatasetCatalog : IS8DatasetCatalog, ITransient
- {
- private readonly Dictionary<string, S8DatasetDefinition> _definitions;
- public S8DatasetCatalog(IEnumerable<IS8DatasetDefinitionSource> sources)
- {
- _definitions = new Dictionary<string, S8DatasetDefinition>(StringComparer.OrdinalIgnoreCase);
- foreach (var source in sources)
- {
- foreach (var definition in source.GetDefinitions())
- {
- if (string.IsNullOrWhiteSpace(definition.DatasetCode)) continue;
- var code = definition.DatasetCode.Trim();
- // 重复定义视为配置错误:静默取其一会让实际生效的能力声明不可预测。
- if (_definitions.ContainsKey(code))
- {
- throw new InvalidOperationException(
- $"数据集 {code} 被重复定义(来源包含 {source.GetType().Name})");
- }
- if (!S8DatasetKind.IsKnown(definition.Kind))
- throw new InvalidOperationException($"数据集 {code} 的 Kind 非法:{definition.Kind}");
- if (!S8DatasetStatus.IsDeclarable(definition.Status))
- throw new InvalidOperationException($"数据集 {code} 的 Status 非法:{definition.Status}");
- _definitions[code] = definition;
- }
- }
- }
- public IReadOnlyCollection<S8DatasetDefinition> All => _definitions.Values;
- public bool IsDefined(string? datasetCode) =>
- !string.IsNullOrWhiteSpace(datasetCode) && _definitions.ContainsKey(datasetCode!.Trim());
- public S8DatasetDefinition? Find(string? datasetCode)
- {
- if (string.IsNullOrWhiteSpace(datasetCode)) return null;
- return _definitions.TryGetValue(datasetCode.Trim(), out var definition) ? definition : null;
- }
- }
|