非托管 .NET 控制台中的依赖注入日志记录
Dependency Injecting Logging in Non-Hosting .NET Console
如何在非托管控制台应用程序中实施 ILogger
依赖项注入(如托管应用程序)?在下面的代码中,我想像 logTest1
那样工作。这可能吗?
下面是我的 appsettings.json - 我宁愿不必定义每个 class,但这无论如何都行不通。
{
"Logging": {
"LogLevel": {
"Default": "Information",
"Microsoft": "Warning",
"Microsoft.Hosting.Lifetime": "Information",
"ClientTestCli.LogTest": "Trace"
}
}
我的控制台应用程序:
class Program
{
static void Main(string[] args)
{
HandleArgs(args);
var serviceProvider = ContainerConfiguration.Configure();
var logTest1 = new LogTest();
var logTest2 = new LogTest(serviceProvider.GetService<ILogger<LogTest>>());
logTest1.LogStuff();
logTest2.LogStuff();
}
}
容器配置:
internal static class ContainerConfiguration
{
public static ServiceProvider Configure()
{
return new ServiceCollection()
.AddLogging(l => l.AddConsole())
.Configure<LoggerFilterOptions>(c => c.MinLevel = LogLevel.Trace)
.BuildServiceProvider();
}
}
测试class:
internal class LogTest
{
ILogger<LogTest> logger;
public LogTest(ILogger<LogTest> logger = null)
{
this.logger = logger;
}
public void LogStuff()
{
logger?.LogCritical("This is a critical log");
}
}
将 LogTest
添加到服务集合并使用提供程序解析它,提供程序将注入配置的记录器
重构你的组合根
internal static class ContainerConfiguration {
public static IServiceProvider Configure(Action<IServiceCollection> configuration = null) {
var services = new ServiceCollection()
.AddLogging(logging => {
logging.ClearProviders();
logging.AddConsole();
})
.Configure<LoggerFilterOptions>(c => c.MinLevel = LogLevel.Trace);
configuration?.Invoke(services);
return services.BuildServiceProvider();
}
}
并在启动时使用它
static void Main(string[] args) {
HandleArgs(args);
IServiceProvider serviceProvider = ContainerConfiguration.Configure(services => {
services.AddTransient<LogTest>();
});
LogTest logTest = serviceProvider.GetService<LogTest>();
logTest.LogStuff();
}
如果使用提供程序,它将负责构建对象图,包括注入所需的依赖项。
.Net Fiddle 一个工作示例。
如何在非托管控制台应用程序中实施 ILogger
依赖项注入(如托管应用程序)?在下面的代码中,我想像 logTest1
那样工作。这可能吗?
下面是我的 appsettings.json - 我宁愿不必定义每个 class,但这无论如何都行不通。
{
"Logging": {
"LogLevel": {
"Default": "Information",
"Microsoft": "Warning",
"Microsoft.Hosting.Lifetime": "Information",
"ClientTestCli.LogTest": "Trace"
}
}
我的控制台应用程序:
class Program
{
static void Main(string[] args)
{
HandleArgs(args);
var serviceProvider = ContainerConfiguration.Configure();
var logTest1 = new LogTest();
var logTest2 = new LogTest(serviceProvider.GetService<ILogger<LogTest>>());
logTest1.LogStuff();
logTest2.LogStuff();
}
}
容器配置:
internal static class ContainerConfiguration
{
public static ServiceProvider Configure()
{
return new ServiceCollection()
.AddLogging(l => l.AddConsole())
.Configure<LoggerFilterOptions>(c => c.MinLevel = LogLevel.Trace)
.BuildServiceProvider();
}
}
测试class:
internal class LogTest
{
ILogger<LogTest> logger;
public LogTest(ILogger<LogTest> logger = null)
{
this.logger = logger;
}
public void LogStuff()
{
logger?.LogCritical("This is a critical log");
}
}
将 LogTest
添加到服务集合并使用提供程序解析它,提供程序将注入配置的记录器
重构你的组合根
internal static class ContainerConfiguration {
public static IServiceProvider Configure(Action<IServiceCollection> configuration = null) {
var services = new ServiceCollection()
.AddLogging(logging => {
logging.ClearProviders();
logging.AddConsole();
})
.Configure<LoggerFilterOptions>(c => c.MinLevel = LogLevel.Trace);
configuration?.Invoke(services);
return services.BuildServiceProvider();
}
}
并在启动时使用它
static void Main(string[] args) {
HandleArgs(args);
IServiceProvider serviceProvider = ContainerConfiguration.Configure(services => {
services.AddTransient<LogTest>();
});
LogTest logTest = serviceProvider.GetService<LogTest>();
logTest.LogStuff();
}
如果使用提供程序,它将负责构建对象图,包括注入所需的依赖项。
.Net Fiddle 一个工作示例。