如何解决如何在启动期间通过在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
更新:
在服务器场(多台服务器)上运行的应用应确保 使用内存缓存时,会话是粘性的。粘性会议 确保来自客户端的后续请求都转到相同的位置 服务器。例如,Azure Web应用程序使用Application Request Routing(ARR)将所有后续请求路由到同一服务器。
Web服务器场中的非粘性会话需要分布式缓存以避免 缓存一致性问题。对于某些应用,distributed cache 与内存缓存相比,可以支持更高的横向扩展。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。