namespace Kbx.Shared.ExternalData; public interface IKrxApprovedServiceNormalizer { string ServiceId { get; } string NormalizerVersion { get; } object Normalize(ReadOnlyMemory payload); } public sealed class KrxApprovedServiceNormalizerRegistry(IEnumerable normalizers) { private readonly IReadOnlyDictionary map=normalizers.ToDictionary(x=>x.ServiceId,StringComparer.Ordinal); public IKrxApprovedServiceNormalizer GetRequired(string serviceId)=>map.TryGetValue(serviceId,out var n)?n:throw new InvalidOperationException($"No approved KRX normalizer is registered for service '{serviceId}'. Universal KRX field mapping is intentionally not guessed."); }