如何在启动期间通过在ASP.NET Core中调用外部API,在每个应用程序生命周期内一次初始化属性或变量?

问题描述

我需要在启动期间的每个应用程序生命周期中一次初始化属性或变量(实际上是字符串值),方法调用一个外部API,然后在另一个类中使用它(最好是通过DI或可以通过一些帮助器类使用)? 。实现此目标的最佳方法是什么?我不确定是否可以在此处使用config参数,因为此值将在运行时通过外部API调用获取。但是我希望在启动过程中只进行一次调用,并在整个应用程序生存期内设置值。

解决方法

应用程序启动后,您可以访问服务注入系统。

例如,首先像这样为您的IHost写一个扩展名:(将此方法放入您喜欢的任何静态类)

        public static IHost PostStart(this IHost host)
        {
            using var scope = host.Services.CreateScope();
            var services = scope.ServiceProvider;
            // You can get your services here.
            var configuration = services.GetService<IConfiguration>();
            
            // And right here,you can initialize your properties. Do anything you like.

            return host;
        }

写完PostStart方法后,在程序启动后调用它。

更改您的Program.cs文件。

    public class Program
    {
        public static void Main(string[] args)
        {
            CreateHostBuilder(args)
                .Build()
                .PostStart() // <- add this.
                .Run();
        }

        public static IHostBuilder CreateHostBuilder(string[] args)
        {
            return Host.CreateDefaultBuilder(args)
                .ConfigureWebHostDefaults(webBuilder => webBuilder.UseStartup<Startup>());
        }
    }

如前所述,您想为服务初始化一些属性。因此,只需将数据存储添加为单例依赖项即可。

// Startup.cs ConfigureServices method.
services.AddSingleton<YourDataStore>();

然后在您的PostStart方法中,使用以下方法进行访问:

// PostStart method.

var data = services.GetRequiredService<YourDataStore>();

var apiService = services.GetRequiredService<YourAPIService>();

data.YourProperty = apiService.GetResultFromYourDataSource();
,

最简单的方法是为该变量创建一个带有静态参数的类,并且仅在null时调用API才能获取它。然后在DI中,您只需将此类声明为Singleton。

就像

public class MyConfig
{
    private static readonly string _configVal;
    public static readonly string ConfigVal
    {
       get
       {
            if(String.IsNullOrEmpty(_configVal))
            {
                _configVal = GetApiValue();
            }
            return _configVal;
        }
    }
}

并在Startup.cs中:

service.AddSingleton<MyConfig>();
,

只需使用内存中缓存并将Console.WriteLine("test")的优先级属性设置为CacheItemPriority,以便在应用程序的生命周期内存储缓存的值。

Cache in-memory in ASP.NET Core

MemoryCacheEntryOptions

更新

在服务器场(多台服务器)上运行的应用应确保 使用内存缓存时,会话是粘性的。粘性会议 确保来自客户端的后续请求都转到相同的位置 服务器。例如,Azure Web应用程序使用Application Request Routing(ARR)将所有后续请求路由到同一服务器。

Web服务器场中的非粘性会话需要分布式缓存以避免 缓存一致性问题。对于某些应用,distributed cache 与内存缓存相比,可以支持更高的横向扩展。

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...