缺少 IHostedService 的依赖项时没有异常或日志记录吗?

问题描述 投票:0回答:1

我的一位同事正在开发一个控制台应用程序,我们遇到了一些麻烦。启动应用程序只会弹出一个空的控制台窗口,然后该窗口会立即关闭。

不会遇到断点。任何地方都不会记录任何错误。无输出。

经过几分钟的摸索,我发现他的应用程序无法运行的原因是由于他的主要

IHostedService
的依赖项未注册。很简单就能修复。

我想知道的是; 为什么控制台没有记录任何异常或错误?这会让我们的生活变得更加轻松。

示例(非常快速地敲在一起):

//[Program.cs]

namespace FooNamespace
{
    internal class Program
    {
        static void Main(string[] args)
        {
            var hostBuilder = Host.CreateDefaultBuilder(args)
                .UseConsoleLifetime()
                 .ConfigureServices((_, services) =>
                 {
                     services.AddHostedService<FooHostedService>();
 
                     //Missing dependency
                     //services.AddSingleton<IFooDependency, FooDependency>();
                 });
 
            hostBuilder.RunConsoleAsync();
        }
    }
}

// [FooHostedService.cs]

namespace FooNamespace
{
    internal class FooHostedService : IHostedService
    {
        private IFooDependency FooDependency { get; }
 
        public FooHostedService(IFooDependency fooDependency)
        {
            FooDependency = fooDependency;
        }
 
        public Task StartAsync(CancellationToken cancellationToken)
        {
            //If the program were working, this should display a string and pause for input
            Console.WriteLine("Hello, world!");
            Console.ReadKey(true);
            return Task.CompletedTask;
        }
 
        public Task StopAsync(CancellationToken cancellationToken)
        {
            return Task.CompletedTask;
        }
    }
}
c# exception logging console-application ihostedservice
1个回答
0
投票

首先,您缺少 await RunConsoleAsync 方法。 这应该足够了。

此外,我建议您使用日志库作为Seriloghttps://github.com/serilog/serilog/wiki/Configuration-Basics

这是一个例子:

using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Hosting;
using Serilog;

namespace FooNamespace
{
    internal class Program
    {
        static async Task Main(string[] args)
        {
            Log.Logger = new LoggerConfiguration()
                .WriteTo.Console()
                .CreateBootstrapLogger();

            try
            {
                var hostBuilder = Host.CreateDefaultBuilder(args)
                    .UseConsoleLifetime()
                     .ConfigureServices((_, services) =>
                     {
                         services.AddHostedService<FooHostedService>();

                         //Missing dependency
                         //services.AddSingleton<IFooDependency, FooDependency>();
                     });

                await hostBuilder.RunConsoleAsync();
            }
            catch (Exception ex)
            {
                Log.Fatal(ex, ex.Message);
            }
            finally
            {
                Log.CloseAndFlush();
            }
        }
    }
}

在这种情况下,您还会记录其他类型的问题,例如主机构建问题。请参阅:https://nblumhardt.com/2020/10/bootstrap-logger/

© www.soinside.com 2019 - 2024. All rights reserved.