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