如何 运行 .NET Core 控制台应用程序使用通用主机构建器
How to run .NET Core Console app using generic host builder
我正在尝试弄清楚如何将主机构建器模式用于 运行 控制台应用程序(而不是 windows 服务)。目的是保持流程与 WebApi 相似,以保持开发实践相似。我看过使用 HostedService 或 BackGroundService 的示例,他们希望将其 运行 作为 windows 服务。但是如果我正在寻找 运行 一个简单的控制台应用程序,我应该在哪里指定我的入口点 class 和方法?从 hostbuilder.Build() 中,我可以看到 运行() 和 运行Async() 方法。但是我不知道它会执行什么?
我看过其他示例,说明您可以在其中创建 servicecollection,然后使用 serviceprovider.GetService().SomeMethod() 启动进程。但这偏离了我们想要做的事情。所以请建议如何指定启动过程。我们正在使用 3.1 .Net Core。
class Program
{
static async void Main(string[] args)
{
var host = CreateHostBuilder(args).Build();
await host.RunAsync();
}
public static IHostBuilder CreateHostBuilder(string[] args) =>
Host.CreateDefaultBuilder(args)
.ConfigureServices((hostBuilderContext, serviceCollection) => new Startup(hostBuilderContext.Configuration).ConfigureServices(serviceCollection))
.UseSerilog()
;
}
编辑:.NET 6 更新如下↓
我将从默认的 worker
模板开始。它预装了必要的软件包。如果您已有项目,请安装 Microsoft.Extensions.Hosting
包。
dotnet new worker -n MyCli
然后打开Program.cs
并构建主机。如果您不想使用托管服务路线,请删除 Worker
托管服务。
public class Program
{
public static void Main(string[] args)
{
var host = CreateHostBuilder(args).Build();
}
public static IHostBuilder CreateHostBuilder(string[] args) =>
Host.CreateDefaultBuilder(args)
.ConfigureServices((hostContext, services) =>
{
// remove the hosted service
// services.AddHostedService<Worker>();
// register your services here.
});
}
建立你的逻辑:
internal class MyService
{
// you can also inject other services
private ILogger<MyService> _logger;
public MyService(ILogger<MyService> logger)
{
_logger = logger;
}
public void DoSomething()
{
_logger.LogInformation("Doing something");
}
}
然后在.ConfigureServices方法中注册class
Host.CreateDefaultBuilder(args)
.ConfigureServices((hostContext, services) =>
{
services.AddTransient<MyService>();
});
现在您可以在 Main
方法中解析和调用它了:
public static void Main(string[] args)
{
var host = CreateHostBuilder(args).Build();
var myService = host.Services.GetRequiredService<MyService>();
myService.DoSomething();
}
.NET 6 更新
使用 .NET 6,样板文件显着减少。我们可以将 Program.cs
重写为:
var host = Host.CreateDefaultBuilder(args)
.ConfigureServices(services => { services.AddTransient<MyService>(); })
.Build();
var my = host.Services.GetRequiredService<MyService>();
await my.ExecuteAsync();
class MyService
{
private readonly ILogger<MyService> _logger;
public MyService(ILogger<MyService> logger)
{
_logger = logger;
}
public async Task ExecuteAsync(CancellationToken stoppingToken = default)
{
_logger.LogInformation("Doing something");
}
}
我正在尝试弄清楚如何将主机构建器模式用于 运行 控制台应用程序(而不是 windows 服务)。目的是保持流程与 WebApi 相似,以保持开发实践相似。我看过使用 HostedService 或 BackGroundService 的示例,他们希望将其 运行 作为 windows 服务。但是如果我正在寻找 运行 一个简单的控制台应用程序,我应该在哪里指定我的入口点 class 和方法?从 hostbuilder.Build() 中,我可以看到 运行() 和 运行Async() 方法。但是我不知道它会执行什么?
我看过其他示例,说明您可以在其中创建 servicecollection,然后使用 serviceprovider.GetService().SomeMethod() 启动进程。但这偏离了我们想要做的事情。所以请建议如何指定启动过程。我们正在使用 3.1 .Net Core。
class Program
{
static async void Main(string[] args)
{
var host = CreateHostBuilder(args).Build();
await host.RunAsync();
}
public static IHostBuilder CreateHostBuilder(string[] args) =>
Host.CreateDefaultBuilder(args)
.ConfigureServices((hostBuilderContext, serviceCollection) => new Startup(hostBuilderContext.Configuration).ConfigureServices(serviceCollection))
.UseSerilog()
;
}
编辑:.NET 6 更新如下↓
我将从默认的 worker
模板开始。它预装了必要的软件包。如果您已有项目,请安装 Microsoft.Extensions.Hosting
包。
dotnet new worker -n MyCli
然后打开Program.cs
并构建主机。如果您不想使用托管服务路线,请删除 Worker
托管服务。
public class Program
{
public static void Main(string[] args)
{
var host = CreateHostBuilder(args).Build();
}
public static IHostBuilder CreateHostBuilder(string[] args) =>
Host.CreateDefaultBuilder(args)
.ConfigureServices((hostContext, services) =>
{
// remove the hosted service
// services.AddHostedService<Worker>();
// register your services here.
});
}
建立你的逻辑:
internal class MyService
{
// you can also inject other services
private ILogger<MyService> _logger;
public MyService(ILogger<MyService> logger)
{
_logger = logger;
}
public void DoSomething()
{
_logger.LogInformation("Doing something");
}
}
然后在.ConfigureServices方法中注册class
Host.CreateDefaultBuilder(args)
.ConfigureServices((hostContext, services) =>
{
services.AddTransient<MyService>();
});
现在您可以在 Main
方法中解析和调用它了:
public static void Main(string[] args)
{
var host = CreateHostBuilder(args).Build();
var myService = host.Services.GetRequiredService<MyService>();
myService.DoSomething();
}
.NET 6 更新
使用 .NET 6,样板文件显着减少。我们可以将 Program.cs
重写为:
var host = Host.CreateDefaultBuilder(args)
.ConfigureServices(services => { services.AddTransient<MyService>(); })
.Build();
var my = host.Services.GetRequiredService<MyService>();
await my.ExecuteAsync();
class MyService
{
private readonly ILogger<MyService> _logger;
public MyService(ILogger<MyService> logger)
{
_logger = logger;
}
public async Task ExecuteAsync(CancellationToken stoppingToken = default)
{
_logger.LogInformation("Doing something");
}
}