namespace Admin.NET.Plugin.AiDOP.Service.S8.Rules.DataAccess; /// 数据集目录:回答"系统里有没有这个数据集、它是什么"。不回答"谁供数"。 public interface IS8DatasetCatalog { /// 该编码是否已定义。 bool IsDefined(string? datasetCode); /// 取定义;未定义返回 null。 S8DatasetDefinition? Find(string? datasetCode); /// 全部已定义数据集。 IReadOnlyCollection All { get; } } /// /// 默认目录实现:聚合所有 。 /// /// 与 的分工: /// Catalog → Dataset 是什么(定义、种类、能力、是否停用) /// Registry → 当前哪个 Provider 实现它(运行时供数) /// /// Batch 1 曾把两者合一("注册即目录"),导致"数据集不存在"与"Provider 未实现" /// 无法区分。本批拆开后,规则可以在 Provider 上线前先配置好。 /// public class S8DatasetCatalog : IS8DatasetCatalog, ITransient { private readonly Dictionary _definitions; public S8DatasetCatalog(IEnumerable sources) { _definitions = new Dictionary(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 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; } }