如何 运行 .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");
    }
}