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;
}
}