Web.API - 如何基于 CultureInfo 验证语言的性能列表

问题描述 投票:0回答:1

我正在使用 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
一次加载到内存中并从所有请求中访问它?我需要一个单身人士吗?并行读取访问是否存在任何问题?

我对这些细节只有基本的了解,但有哪些选择?

c# performance validation cultureinfo
1个回答
0
投票

你手上的字典是最好的选择:

  1. 查找是一个常量 O(1) 操作
  2. 它已经被声明为静态变量,因此它可以作为单例重用

您可以通过接口声明字典并注入依赖项,以便它在您的验证类中可用。

例如:

public interface ISingleton {
    Dictionary<string, CultureInfo> Instance { get; }
}

service.AddSingleton<ISingleton>(() => new Singleton {Instance = CultureInfo.GetCultures(CultureTypes.AllCultures).ToDictionary(c => c.Name)});

使用依赖注入的一个好处是你的类不再依赖于静态属性,这使得事情更可重用和可测试。

© www.soinside.com 2019 - 2024. All rights reserved.