Startup.cs 非常特定于 ASP.NET Core,它本身就是一个 Web 堆栈,由 IIS 后面的 WebListener 或 Kestrel 托管。
在控制台应用程序中,您不会使用传统的 Startup.cs,尽管您可以拥有一致的基础,但它看起来会有些不同,因为您可以控制创建 IoC 容器(而不是 ASP .NET Core 在 Web 应用程序中为您执行此操作)。通常,Startup.cs 由Program.cs 中的WebHostBuilder 处理,以允许它在将IServiceCollection 传递给ConfigureServices 方法之前注入自己的东西。
您是对的,您需要一个控制台应用程序,并且您可以自己完成所有工作。
public class Program
{
public IConfigurationRoot Configuration { get; private set; }
public IServiceProvider Provider { get; private set; }
public static void Main()
{
var programm = new Programm();
program.Run();
}
private void Run()
{
var builder = new ConfigurationBuilder()
.AddJsonFile("appsettings.json", optional: true, reloadOnChange: true)
.AddEnvironmentVariables();
Configuration = builder.Build();
var services = new ServiceCollection();
ConfigureServices(services);
this.Provider = services.BuildServiceProvider();
var host = this.Provider.GetRequiredService<MyHost>();
// blocking operation, the host should be something that keeps the service running
// once it stops, the application stops too as there are no additional
host.Run();
}
private void ConfigureServices(IServiceCollection services)
{
services.AddTransient<IMyService, MyService>();
services.AddSingleton<MyHost>();
...
}
}
您想用作主机的内容由您决定。它可能是一个 Azure Web 任务/主机:
using(var jobHost = new JobHost(new JobHostConfiguration(Configuration.GetConnectionString("AzureWebJobsDashboard"))))
{
jobHost.RunAndBlock();
}
这将启动并保持应用程序运行并接收其中注册的 Azure 消息和事件。或者您使用其他一些后台任务框架,例如 Hangfire。
在 ASP.NET Core 中,所有这些都由框架处理,但 ASP.NET Core 是为 Web 内容而设计的,因此依赖于端点。 ASP.NET Core 应用程序中使用的Startup 类的Configure 方法中的大部分内容都是关于注册中间件,这些中间件在HttpContext 上工作。在没有端点的微服务中没有这些。没有端点,没有HttpContext,不需要中间件。
当然,您在控制台应用程序中也没有IApplicationBuilder,只有一个IServiceProvider 来解析您之前注册的服务。