繁体   English   中英

.NET DependencyInjection 和 Serilog 不使用 IHost(用于控制台应用程序)

[英].NET DependencyInjection and Serilog without using IHost (for console app)

当您查看 .NET 项目上的依赖注入和 Serilog 解决方案时,大多数文档和博客都参考 IHost model。 对于当前的 .NET 6 或其他版本的 .NET 内核,这无关紧要。 对于自 .NET Core 2.1 以来提供 REST API 的应用程序,这是我最喜欢的方式。

我首先定义了一个 BuildLogger() 方法来配置具有最低日志级别的 Serilog 并添加我需要的所有丰富器/接收器。

所以我的 Program.Main 方法曾经看起来像:

Log.Logger = LoggerBuilder.BuildLogger();
var builder = Host.CreateDefaultBuilder(args).UseSerilog();  // serilog injected in Host.
builder.ConfigureServices(services => services.AddMyServices());
using var source = new CancellationTokenSource();
await builder.Build().RunAsync(source.Token).ConfigureAwait(false);

一切都好。

问题是:如何在不使用来自 .NET 6 的 IHost model的情况下重用 DI 和 Serilog? 我今天的用户案例是一个控制台应用程序,它只运行一些测试然后关闭,并且仍然重用我为以前的应用程序编写的一些部分。

所以代替上面的,我定义了

Log.Logger = LoggerBuilder.BuildLogger(); 
await using var serviceProvider = new ServiceCollection()
       .AddMyServices()
       .AddLogging(logBuilder => logBuilder.AddSerilog()) // attach serilog.
       .BuildServiceProvider()

RunTests(serviceProvider);   

这似乎按预期工作。

使用 AddLogging/AddSerilog() 而不是 UseSerilog() 的技巧可能对其他人有帮助!

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM