Estoy tratando de descubrir cómo usar el patrón de hostbuilder para ejecutar una aplicación de consola (no un servicio de Windows). La intención es mantener el flujo similar a un WebApi para mantener las prácticas de desarrollo similares. He visto muestras para usar HostedService o BackGroundService, donde quieren ejecutarlo como un servicio de Windows. Pero si estoy buscando ejecutar una aplicación de consola simple, ¿dónde especifico mi clase y método de punto de entrada? Desde hostbuilder.Build(), puedo ver los métodos Run() y RunAsync(). Pero no puedo averiguar qué ejecutará.
He visto otros ejemplos de dónde puede crear una colección de servicios y luego usar serviceprovider.GetService().SomeMethod() para iniciar el proceso. Pero eso se desvía de lo que queremos hacer. Entonces, sugiera cómo especificar el proceso de inicio. Estamos usando 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() ; }EDITAR: la actualización de .NET 6 está debajo ↓
Comenzaría con la plantilla de worker predeterminada. Viene con los paquetes necesarios preinstalados. Si ya tiene un proyecto, instale el paquete Microsoft.Extensions.Hosting .
dotnet new worker -n MyCli Luego abra Program.cs y cree el host. Elimine el servicio alojado de Worker si no quiere ir con la ruta del servicio alojado.
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. }); }Construye tu lógica:
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"); } }Luego registre la clase dentro del método .ConfigureServices
Host.CreateDefaultBuilder(args) .ConfigureServices((hostContext, services) => { services.AddTransient<MyService>(); }); Ahora puede resolverlo y llamarlo dentro del método Main :
public static void Main(string[] args) { var host = CreateHostBuilder(args).Build(); var myService = host.Services.GetRequiredService<MyService>(); myService.DoSomething(); } Con .NET 6, el modelo estándar se reduce significativamente. Podemos reescribir nuestro Program.cs como:
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"); } }