我正在使用 Web.API/.Net 7,需要验证并符合来自
language ranges
标头的 Accept-Language
列表。应根据可能的 CultureInfo.Name
选项列表检查语言范围。语言范围不得遵循大小写。因此,如果匹配,则应使用格式正确的CultureInfo.Name
。
在是否有一种方法可以将字符串“尝试解析”为System.Globalization.CultureInfo,推荐的验证选项是使用
CultureInfo.GetCultures(CultureTypes.AllCultures)
.
可以使用 LINQ
Find()
找到匹配的元素。即使 CultureInfo.GetCultures(CultureTypes.AllCultures)
已经返回一个排序的名称列表,它对 Find()
没有多大帮助。
我认为有一个比在每个请求的
CultureInfos
标头中为每种语言扫描 800 多个 Accept-Language
条目更高效的解决方案。
在上面的帖子中,建议将所有元素放入字典中并进行搜索。
static readonly Dictionary<string, CultureInfo> CultureDict =
CultureInfo.GetCultures(CultureTypes.AllCultures).ToDictionary(c => c.Name);
SortedList
和 BinarySearch
也是一种选择吗?
我怎样才能将
Dictionary
或 SortedList
一次加载到内存中并从所有请求中访问它?我需要一个单身人士吗?并行读取访问是否存在任何问题?
我对这些细节只有基本的了解,但有哪些选择?
你手上的字典是最好的选择:
您可以通过接口声明字典并注入依赖项,以便它在您的验证类中可用。
例如:
public interface ISingleton {
Dictionary<string, CultureInfo> Instance { get; }
}
service.AddSingleton<ISingleton>(() => new Singleton {Instance = CultureInfo.GetCultures(CultureTypes.AllCultures).ToDictionary(c => c.Name)});
使用依赖注入的一个好处是你的类不再依赖于静态属性,这使得事情更可重用和可测试。