【问题标题】:How to run .NET Core Console app using generic host builder如何使用通用主机生成器运行 .NET Core 控制台应用程序
【发布时间】:2021-07-15 10:48:35
【问题描述】:

我试图弄清楚如何使用主机构建器模式来运行控制台应用程序(而不是 Windows 服务)。目的是保持流程与 WebApi 相似,以保持开发实践相似。我已经看到了使用 HostedService 或 BackGroundService 的示例,他们希望将其作为 Windows 服务运行。但是如果我想运行一个简单的控制台应用程序,我在哪里指定我的入口点类和方法?从 hostbuilder.Build() 中,我可以看到 Run() 和 RunAsync() 方法。但我无法弄清楚它会执行什么?

我已经看到了其他示例,您可以在其中创建 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()
        ; 

}

【问题讨论】:

  • 使用dotnet new worker 创建工作应用程序。它使用主机构建器模式并且开箱即用。
  • 感谢您的建议。我尝试过这个。它使用 HostedService。那么使用 HostedService 是唯一的使用方法吗,即使我没有将控制台应用程序作为 Windows 服务运行?
  • 不,您不必使用托管服务。您可以使用工作器项目模板作为如何设置 DI 容器的参考。拥有主机后,您可以使用它来解析服务并在 Main 方法中调用它们,无需指定入口点。或者直接使用托管服务,它不需要是 windows/systemd 服务才能运行。

标签: c# asp.net-core .net-core console-application


【解决方案1】:

编辑: .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方法里面注册类

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");
    }
}

【讨论】:

  • 注意:使用“Microsoft.Extensions.Hosting”。可能需要一个 NuGet 包。
  • @HeinrichUlbricht 是的。但是worker 模板预装了该软件包。
猜你喜欢
  • 2017-01-02
  • 1970-01-01
  • 1970-01-01
  • 2013-01-18
  • 2019-12-29
  • 1970-01-01
  • 2011-02-10
  • 2018-04-09
  • 1970-01-01
相关资源
最近更新 更多