using Microsoft.Extensions.Options; namespace DramaLing.Api.Models.Configuration; /// /// OptionsVocabularyOptions 配置驗證器 /// public class OptionsVocabularyOptionsValidator : IValidateOptions { public ValidateOptionsResult Validate(string? name, OptionsVocabularyOptions options) { var errors = new List(); // 驗證快取過期時間 if (options.CacheExpirationMinutes < 1 || options.CacheExpirationMinutes > 60) { errors.Add("CacheExpirationMinutes must be between 1 and 60 minutes"); } // 驗證最小詞彙庫門檻 if (options.MinimumVocabularyThreshold < 1 || options.MinimumVocabularyThreshold > 100) { errors.Add("MinimumVocabularyThreshold must be between 1 and 100"); } // 驗證詞彙長度差異範圍 if (options.WordLengthTolerance < 0 || options.WordLengthTolerance > 10) { errors.Add("WordLengthTolerance must be between 0 and 10"); } // 驗證快取大小限制 if (options.CacheSizeLimit < 10 || options.CacheSizeLimit > 1000) { errors.Add("CacheSizeLimit must be between 10 and 1000"); } // 驗證快取預熱組合 if (options.PrewarmCombinations != null) { var validCEFRLevels = new[] { "A1", "A2", "B1", "B2", "C1", "C2" }; var validPartsOfSpeech = new[] { "noun", "verb", "adjective", "adverb", "pronoun", "preposition", "conjunction", "interjection", "idiom" }; foreach (var combination in options.PrewarmCombinations) { if (string.IsNullOrEmpty(combination.CEFRLevel) || !validCEFRLevels.Contains(combination.CEFRLevel)) { errors.Add($"Invalid CEFR level in prewarm combination: {combination.CEFRLevel}"); } if (string.IsNullOrEmpty(combination.PartOfSpeech) || !validPartsOfSpeech.Contains(combination.PartOfSpeech)) { errors.Add($"Invalid part of speech in prewarm combination: {combination.PartOfSpeech}"); } } } return errors.Any() ? ValidateOptionsResult.Fail(errors) : ValidateOptionsResult.Success; } }