gpt4 book ai didi

c# - ASP.NET 核心在单例服务上调用异步初始化

转载 作者:行者123 更新时间:2023-12-04 11:15:21 24 4
gpt4 key购买 nike

我有一个服务,它在一个名为 InitAsync 的方法中从文件中异步读取一些内容。

public class MyService : IService {
private readonly IDependency injectedDependency;

public MyService(IDependency injectedDependency) {
this.injectedDependency = injectedDependency;
}

public async Task InitAsync() {
// async loading from file.
}
}

现在这个服务被注入(inject)到我的 Controller 中。
public class MyController : Controller {
private readonly IService service;

public MyController(IService service) {
this.service = service;
}
}

现在我想要一个 MyService 的单例实例。我想在启动时调用 InitAsync。
public class Startup {
public void ConfigureServices(IServiceCollection services) {
......
services.AddSingleton<IService, MyService>();
var serviceProvider = services.BuildServiceProvider();
// perform async init.
serviceProvider.GetRequiredService<IService>().InitAsync();
}
}

发生的事情是在启动时,创建了一个 MyService 实例,并且 InitAsync()被称为它。然后,当我调用 Controller 类时,会创建另一个 MyService 实例,然后将其重用于后续调用。

我需要的是仅初始化 1 个实例,在启动时对其调用 InitAsync() 并让它也由 Controller 重用。

最佳答案

What is happening is at the time of startup, an instance of MyService is created and InitAsync() is called on it. Then when I called the controller class, another instance of MyService is created which is then reused for consequent calls.



当您拨打 BuildServiceProvider() ,您创建 IServiceProvider 的单独实例,它创建了自己的 IService 单例实例. IServiceProvider在解析 IService 时使用这是为 MyController 提供的与您自己创建的不同,因此 IService本身也是不同的(并且未初始化)。

What I need is to initialize only 1 instance, called InitAsync() on it in startup and have it be reused by controllers as well.



而不是尝试解析和初始化 IService内部 Startup.ConfigureServices ,您可以在 Program.Main 中这样做.这允许做两件事:
  • 使用 IService 的相同实例用于初始化和以后使用。
  • await拨打 InitAsync ,目前在您展示的方法中是一次性的。

  • 这是一个示例,说明如何 Program.Main可能看起来:
    public static async Task Main(string[] args)
    {
    var webHost = CreateWebHostBuilder(args).Build();

    await webHost.Services.GetRequiredService<IService>().InitAsync();

    webHost.Run();
    // await webHost.RunAsync();
    }

    这使用 async Main 启用 await ,构建 IWebHost并使用其 IServiceProvider解析和初始化 IService .该代码还展示了如何使用 awaitRunAsync如果您愿意,现在方法是 async .

    关于c# - ASP.NET 核心在单例服务上调用异步初始化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56077346/

    24 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com