C# 解析启动时注册的Main.cs内的服务
我的问题是:是否可以解析Web Api应用程序(.net core)的main.cs中的服务? 我通常做的当然是在启动时注册所有服务,并在需要的地方注入它们 我的情况是,只有一个web api应用程序公开了一些REST控制器。每当这个应用程序启动时,我希望它开始在后台做一些事情。 出于这个原因,我想获得一个在Startup中注册的服务实例,并在Main.cs中调用它 我的漂亮朴素的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
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服务,我在哪里存储此数据结构(字典)?在工人服务本身?当我从我的应用程序请求它时,我只是在那里访问它?