在 ASP.NET 核心 5 中,如何创建一个可以在所有 Web 请求中访问的字符串列表?

In ASP.NET Core 5, How to create a list of strings which can be accessed within all web requests?

我的问题是我什至不明白我应该在哪里研究什么以及我应该使用什么搜索 words/terminology 或者我应该研究 ASP.NET Core 的哪些方面。是的,我确认我对 Core 的了解非常有限,我一直在阅读文档,但到目前为止没有成功。

这就是我想要达到的效果:

在我的网站可以处理任何传入的 HTTP 请求(在应用程序启动时)之前,我想在 array/object 中构建一个字符串列表(键、值)。这些字符串是从 SQL table 中读取的,列表可以包含 10,000 到 20,000 个项目(键、值)。这些字符串不会改变,因此我觉得最好将它们保存在内存中(当 Web 服务器 starts/app 启动时预加载到内存中)。

重要的是,我想在(每个)Web 服务器实例中保留此 list/dictionary 的一个副本,并且我希望每个传入的 HTTP 请求都能够访问此字符串列表(只读,不会对字符串进行任何更改)即我希望在所有 HTTP 请求之间共享此字符串列表。 我不知道,如果这是可能的,如果是的话,那么我到底应该寻找什么。 你能告诉我解决方案是什么或者我应该研究什么吗?

创建接口:

public interface IMyStaticData
{
    IReadOnlyList<string> GetData();
}

创建实现:

public class MyStaticDataFromDatabase : IMyStaticData
{
    IReadOnlyList<string> data = null;
    readonly object sync = new object();

    public IReadOnlyList<string> GetData()
    {
        if (data != null) return data;

        lock (sync)
        {
             if (data != null) return data;
             data = // get data from database
        }

        return data;
    }
}

Startup.cs

中将接口注册为单例
services.AddSingleton<IMyStaticData, MyStaticDataFromDatabase>();

在控制器/剃须刀页面等中使用此界面

数据将在第一次使用时从数据库加载。如果想在app启动时执行GetData(),需要添加类似这样的代码:

using IServiceScope serviceScope = app
.ApplicationServices
.GetRequiredService<IServiceScopeFactory>()
.CreateScope()
{
    serviceScope.ServiceProvider.GetRequiredService<IMyStaticData>().GetData();
}