首页 > 解决方案 > 创建并运行默认主机后如何访问服务提供者?

问题描述

我有一个 .NET Core 控制台应用程序并创建一个新的默认主机实例。我在静态扩展类中配置我的服务,并且有一个服务是单例的。在我的Program文件中,我必须访问一次实例,以便从中调用方法。

鉴于此示例代码

class Program
{
    public static void Main(string[] args)
        => new Program()
            .MainAsync(args)
            .GetAwaiter()
            .GetResult();

    private async Task MainAsync(string[] args)
    {
        await Host.CreateDefaultBuilder(args)
            .ConfigureServices((hostBuilderContext, serviceCollection) =>
            {
                // This comes from another class configuring all the services for the serviceCollection
                serviceCollection.AddSingleton<MyService>();
            })
            .Build()
            .RunAsync();
        
        // Get access to the service provider
        // Get MyService instance from the service provider
    }
}

有没有办法在方法下方动态创建服务提供者的新实例RunAsync

标签: c#.net-core

解决方案


Host.CreateDefaultBuilder返回IHostBuilderwhich 提供IHostBuilder.Buildwhich 反过来返回IHostIHost包含 IHost.Services表示已配置 DI 容器的属性。如果您想访问它,请IHost在启动之前将其存储在变量中。

    private async Task MainAsync(string[] args)
    {
        var host = Host.CreateDefaultBuilder(args)
            .ConfigureServices((hostBuilderContext, serviceCollection) =>
            {
                // This comes from another class configuring all the services for the serviceCollection
                serviceCollection.AddSingleton<MyService>();
            })
            .Build();

        await host.StartAsync();
        var myService = host.Services.GetRequiredService<MyService>();
        /* some useful code */

        await host.WaitForShutdownAsync();
    }

推荐阅读