C# 解析启动时注册的Main.cs内的服务

C# 解析启动时注册的Main.cs内的服务,c#,.net-core,dependency-injection,C#,.net Core,Dependency Injection,我的问题是:是否可以解析Web Api应用程序(.net core)的main.cs中的服务? 我通常做的当然是在启动时注册所有服务,并在需要的地方注入它们 我的情况是,只有一个web api应用程序公开了一些REST控制器。每当这个应用程序启动时,我希望它开始在后台做一些事情。 出于这个原因,我想获得一个在Startup中注册的服务实例,并在Main.cs中调用它 我的漂亮朴素的Main.cs: public static void Main(string[] args) { var

我的问题是:是否可以解析Web Api应用程序(.net core)的main.cs中的服务? 我通常做的当然是在启动时注册所有服务,并在需要的地方注入它们

我的情况是,只有一个web api应用程序公开了一些REST控制器。每当这个应用程序启动时,我希望它开始在后台做一些事情。 出于这个原因,我想获得一个在Startup中注册的服务实例,并在Main.cs中调用它

我的漂亮朴素的Main.cs:

public static void Main(string[] args)
{
    var webHostBuilder = CreateHostBuilder(args).Build();

    var configuration = new ConfigurationBuilder()
        .SetBasePath(Directory.GetCurrentDirectory())
        .AddJsonFile("appsettings.json", optional: false, reloadOnChange: true)
        .AddJsonFile($"appsettings.{Environment.GetEnvironmentVariable("ASPNETCORE_ENVIRONMENT") ?? "Production"}.json", optional: true)
        .Build();

    Log.Logger = new LoggerConfiguration()
        .ReadFrom.Configuration(configuration)
        .CreateLogger();

    try
    {
        Log.Information("Starting web host");
        webHostBuilder.Run();
    }
    catch (Exception ex)
    {
        Log.Fatal(ex, "Host terminated unexpectedly");
    }
    finally
    {
        Log.CloseAndFlush();
    }
}

webHostBuilder
的命名不准确<代码>CreateHostBuilder(args)返回一个生成器。但是,一旦通过
.Build()
构建了web主机生成器,您就可以通过
服务
属性访问其公开的
IServiceProvider

public static void Main(string[] args)
{
    IWebHost webHost = CreateHostBuilder(args).Build();

    IServiceProvider services = webHost.Services; //services can be used to manually resolve
    IMyService myService = services.GetService<IMyService>();

    var configuration = new ConfigurationBuilder()
        .SetBasePath(Directory.GetCurrentDirectory())
        .AddJsonFile("appsettings.json", optional: false, reloadOnChange: true)
        .AddJsonFile($"appsettings.{Environment.GetEnvironmentVariable("ASPNETCORE_ENVIRONMENT") ?? "Production"}.json", optional: true)
        .Build();

    Log.Logger = new LoggerConfiguration()
        .ReadFrom.Configuration(configuration)
        .CreateLogger();

    try
    {
        Log.Information("Starting web host");
        webHost.Run();
    }
    catch (Exception ex)
    {
        Log.Fatal(ex, "Host terminated unexpectedly");
    }
    finally
    {
        Log.CloseAndFlush();
    }
}
publicstaticvoidmain(字符串[]args)
{
IWebHost webHost=CreateHostBuilder(args.Build();
IServiceProvider services=webHost.services;//可以使用服务手动解析
IMyService myService=services.GetService();
var configuration=new ConfigurationBuilder()
.SetBasePath(目录.GetCurrentDirectory())
.AddJsonFile(“appsettings.json”,可选:false,reloadOnChange:true)
.AddJsonFile($”appsettings.{Environment.GetEnvironmentVariable(“ASPNETCORE_环境”)??“Production”}.json”,可选:true)
.Build();
Logger.Logger=新的LoggerConfiguration()
.ReadFrom.Configuration(配置)
.CreateLogger();
尝试
{
日志信息(“启动web主机”);
webHost.Run();
}
捕获(例外情况除外)
{
Log.Fatal(例如,“主机意外终止”);
}
最后
{
Log.CloseAndFlush();
}
}
但我得到的印象是,这是一个错误

每当这个应用程序启动时,我希望它开始在后台做一些事情

这可以通过托管服务实现


参考资料

不清楚你在问什么。您可以使用IHostedService在后台启动或访问主机的服务当前状态下的问题不完整,因此不清楚。@在启动时在ConfigureServices中注册的Nkosi服务在需要时通过DI得到解决和注入(实例本身被注入)。我想知道如何解析一个服务并从Main获取它的实例,如果可能的话。这个回答你的问题吗@德夫努尔:是和否。。行(IServiceScopeFactory)webHost.Services.GetService(typeof(IServiceScopeFactory));但问题的其余部分是为了另一个目的。我不想在运行前执行某些操作。。或者至少我想要它,但不是以那种方式阻止跑步方法,这正是我所需要的!我想我需要安装Microsoft.Extensions.DependencyInjection.Abstractations包,以便按照您的方式使用该GetService方法。我说得对吗?还要了解更多:为什么我的名字错了?再次感谢@Tarta名称
webHostBuilder
意味着变量包含的是一个生成器而不是主机。@Tarta检查答案中包含的链接。我理解你的意思,并提前感谢你的链接!不知道工人服务。我也理解你对XY问题的怀疑,也许你是对的。情况如下:我有一个API服务。当这开始时,我需要开始抓取一个外部API并开始输入一个简单的字典。虽然我的API提供了一个端点,可以读取字典中的内容。如果我使用您的Worker服务,我在哪里存储此数据结构(字典)?在工人服务本身?当我从我的应用程序请求它时,我只是在那里访问它?