C# .NET核心DI和子类
C# .NET核心DI和子类,c#,.net-core,dependency-injection,log4net,asp.net-core-5.0,C#,.net Core,Dependency Injection,Log4net,Asp.net Core 5.0,这里是.NETCore的新成员。我已经搜索了其他文档、线索或指南来回答我的问题,但找不到,如果您认为有,请指出
我正试图用DI创建一个简单的.NET5控制台应用程序,实际上,我一直在用日志构建类
这是使用.NET内核中的DI将记录器(或任何其他服务)传递给子类的正确方法吗?
根据下面的代码,在我的父类构造函数中,我为每个子类使用一个额外的ILogger。
ILogger
Program.cs:
using Microsoft.Extensions.Configuration;
usin
这里是.NETCore的新成员。我已经搜索了其他文档、线索或指南来回答我的问题,但找不到,如果您认为有,请指出
我正试图用DI创建一个简单的.NET5控制台应用程序,实际上,我一直在用日志构建类
这是使用.NET内核中的DI将记录器(或任何其他服务)传递给子类的正确方法吗?
根据下面的代码,在我的父类构造函数中,我为每个子类使用一个额外的ILogger。
ILogger
Program.cs:
using Microsoft.Extensions.Configuration;
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Hosting;
using Microsoft.Extensions.Logging;
using System;
using System.IO;
using System.Threading.Tasks;
namespace ConsoleApp1
{
class Program
{
static async Task Main(string[] args)
{
var builder = new ConfigurationBuilder();
BuildConfig(builder);
var host = Host.CreateDefaultBuilder()
.ConfigureServices((context, services) =>
{
services.AddTransient<ITestClass, TestClass>();
services.AddTransient<ISubClass, SubClass>();
})
.ConfigureLogging(logBuilder =>
{
logBuilder.SetMinimumLevel(LogLevel.Trace);
logBuilder.AddLog4Net("log4net.config");
})
.Build();
var log = host.Services.GetService<ILoggerFactory>().CreateLogger<Program>();
log.LogInformation($"Application Started");
var svc = ActivatorUtilities.CreateInstance<TestClass>(host.Services);
await svc.Run();
log.LogInformation($"Application Ended");
}
static void BuildConfig(IConfigurationBuilder builder)
{
builder.SetBasePath(Directory.GetCurrentDirectory())
.AddJsonFile("appsettings.json", optional: false, reloadOnChange: true)
.AddJsonFile($"appsettings.{Environment.GetEnvironmentVariable("ASPNETCORE_ENVIRONMENT") ?? "Development"}.json", optional: true)
.AddEnvironmentVariables();
}
}
}
使用Microsoft.Extensions.Configuration;
使用Microsoft.Extensions.DependencyInjection;
使用Microsoft.Extensions.Hosting;
使用Microsoft.Extensions.Logging;
使用制度;
使用System.IO;
使用System.Threading.Tasks;
名称空间控制台EAPP1
{
班级计划
{
静态异步任务主(字符串[]args)
{
var builder=new ConfigurationBuilder();
BuildConfig(builder);
var host=host.CreateDefaultBuilder()
.ConfigureServices((上下文、服务)=>
{
services.AddTransient();
services.AddTransient();
})
.ConfigureLogging(logBuilder=>
{
logBuilder.SetMinimumLevel(LogLevel.Trace);
logBuilder.AddLog4Net(“log4net.config”);
})
.Build();
var log=host.Services.GetService().CreateLogger();
log.LogInformation($“应用程序已启动”);
var svc=ActivatorUtilities.CreateInstance(host.Services);
等待svc.Run();
log.LogInformation($“应用程序已结束”);
}
静态void BuildConfig(IConfigurationBuilder)
{
builder.SetBasePath(Directory.GetCurrentDirectory())
.AddJsonFile(“appsettings.json”,可选:false,reloadOnChange:true)
.AddJsonFile($”appsettings.{Environment.GetEnvironmentVariable(“ASPNETCORE_环境”)??“Development”}.json”,可选:true)
.AddenEnvironmentVariables();
}
}
}
TestClass.cs:
using Microsoft.Extensions.Configuration;
using Microsoft.Extensions.Logging;
using System.Threading.Tasks;
namespace ConsoleApp1
{
public class TestClass : ITestClass
{
private readonly ILogger<TestClass> _log;
private readonly ILogger<SubClass> _subClassLog;
private readonly IConfiguration _config;
public TestClass(ILogger<TestClass> log, ILogger<SubClass> subClassLog, IConfiguration config)
{
_log = log;
_subClassLog = subClassLog;
_config = config;
}
public async Task Run()
{
for (int i = 0; i < _config.GetValue<int>("Loop"); i++)
_log.LogDebug("Loop debug {loopNumber}", i);
for (int i = 0; i < _config.GetValue<int>("Loop"); i++)
_log.LogInformation("Loop info {loopNumber}", i);
for (int i = 0; i < _config.GetValue<int>("Loop"); i++)
_log.LogWarning("Loop warn {loopNumber}", i);
for (int i = 0; i < _config.GetValue<int>("Loop"); i++)
_log.LogError("Loop error {loopNumber}", i);
for (int i = 0; i < _config.GetValue<int>("Loop"); i++)
_log.LogCritical("Loop critical {loopNumber}", i);
var subClass = new SubClass(_subClassLog, _config);
await subClass.AnotherProc();
await SubClass.StaticProc();
}
}
}
使用Microsoft.Extensions.Configuration;
使用Microsoft.Extensions.Logging;
使用System.Threading.Tasks;
名称空间控制台EAPP1
{
公共类TestClass:ITestClass
{
私有只读ILogger_日志;
私有只读ILogger _子类日志;
专用只读IConfiguration\u config;
公共测试类(ILogger日志、ILogger子类日志、IConfiguration配置)
{
_log=log;
_子类日志=子类日志;
_config=config;
}
公共异步任务运行()
{
对于(int i=0;i<_config.GetValue(“循环”);i++)
_LogDebug(“循环调试{loopNumber}”,i);
对于(int i=0;i<_config.GetValue(“循环”);i++)
_log.LogInformation(“循环信息{loopNumber}”,i);
对于(int i=0;i<_config.GetValue(“循环”);i++)
_LogWarning(“循环警告{loopNumber}”,i);
对于(int i=0;i<_config.GetValue(“循环”);i++)
_LogError(“循环错误{loopNumber}”,i);
对于(int i=0;i<_config.GetValue(“循环”);i++)
_LogCritical(“循环临界{loopNumber}”,i);
var subClass=新的子类(_subClassLog,_config);
等待子类AnotherProc();
等待子类StaticProc();
}
}
}
C类:
using Microsoft.Extensions.Configuration;
using Microsoft.Extensions.Logging;
using System;
using System.Threading.Tasks;
namespace ConsoleApp1
{
public class SubClass : ISubClass
{
private readonly ILogger<SubClass> _log;
private readonly IConfiguration _config;
public SubClass(ILogger<SubClass> log, IConfiguration config)
{
_log = log;
_config = config;
}
public async Task AnotherProc()
{
for (int i = 0; i < _config.GetValue<int>("Loop"); i++)
_log.LogDebug("Loop debug {loopNumber}", i);
for (int i = 0; i < _config.GetValue<int>("Loop"); i++)
_log.LogInformation("Loop info {loopNumber}", i);
for (int i = 0; i < _config.GetValue<int>("Loop"); i++)
_log.LogWarning("Loop warn {loopNumber}", i);
for (int i = 0; i < _config.GetValue<int>("Loop"); i++)
_log.LogError("Loop error {loopNumber}", i);
for (int i = 0; i < _config.GetValue<int>("Loop"); i++)
_log.LogCritical("Loop critical {loopNumber}", i);
}
public static async Task<bool> StaticProc()
{
var returnBool = true;
try
{
throw new Exception("");
}
catch (Exception ex)
{
returnBool = false;
// No instance, so no _log exception.
// How to create standalone ILogger?
}
return returnBool;
}
}
}
使用Microsoft.Extensions.Configuration;
使用Microsoft.Extensions.Logging;
使用制度;
使用System.Threading.Tasks;
名称空间控制台EAPP1
{
公共类子类:ISubClass
{
私有只读ILogger_日志;
专用只读IConfiguration\u config;
公共子类(ILogger日志、IConfiguration配置)
{
_log=log;
_config=config;
}
公共异步任务AnotherProc()
{
对于(int i=0;i<_config.GetValue(“循环”);i++)
_LogDebug(“循环调试{loopNumber}”,i);
对于(int i=0;i<_config.GetValue(“循环”);i++)
_log.LogInformation(“循环信息{loopNumber}”,i);
对于(int i=0;i<_config.GetValue(“循环”);i++)
_LogWarning(“循环警告{loopNumber}”,i);
对于(int i=0;i<_config.GetValue(“循环”);i++)
_LogError(“循环错误{loopNumber}”,i);
对于(int i=0;i<_config.GetValue(“循环”);i++)
_LogCritical(“循环临界{loopNumber}”,i);
}
公共静态异步任务StaticProc()
{
var returnBool=true;
尝试
{
抛出新异常(“”);
}
捕获(例外情况除外)
{
returnBool=false;
//没有实例,因此没有日志异常。
//如何创建独立ILogger?
}
返回布尔;
}
}
}
appsettings.json:
{
"Loop": 15
}
{
“循环”:15
}
log4net.config:
<?xml version="1.0" encoding="utf-8"?>
<log4net>
<appender name="Info" type="log4net.Appender.RollingFileAppender">
<threshold value="DEBUG" />
<param name="File" value="App_Data\\Log\\Info.log"/>
<param name="AppendToFile" value="true"/>
<maximumFileSize value="5120KB"/>
<lockingModel type="log4net.Appender.FileAppender+MinimalLock" />
<maxSizeRollBackups value="1000"/>
<layout type="log4net.Layout.PatternLayout">
<conversionPattern value="%d{yyyy-MM-dd HH:mm:ss} - [%t] %-5p %c %x - %m%n" />
</layout>
</appender>
<appender name="Error" type="log4net.Appender.RollingFileAppender">
<threshold value="Error" />
<param name="File" value="App_Data\\Log\\Error.log"/>
<param name="AppendToFile" value="true"/>
<maximumFileSize value="5120KB"/>
<lockingModel type="log4net.Appender.FileAppender+MinimalLock" />
<maxSizeRollBackups value="1000"/>
<layout type="log4net.Layout.PatternLayout">
<conversionPattern value="%d{yyyy-MM-dd HH:mm:ss} - [%t] %-5p %c %x - %m%n" />
</layout>
</appender>
<root>
<appender-ref ref="Info" />
<appender-ref ref="Error" />
</root>
</log4net>
{
"Loop": 15
}
<?xml version="1.0" encoding="utf-8"?>
<log4net>
<appender name="Info" type="log4net.Appender.RollingFileAppender">
<threshold value="DEBUG" />
<param name="File" value="App_Data\\Log\\Info.log"/>
<param name="AppendToFile" value="true"/>
<maximumFileSize value="5120KB"/>
<lockingModel type="log4net.Appender.FileAppender+MinimalLock" />
<maxSizeRollBackups value="1000"/>
<layout type="log4net.Layout.PatternLayout">
<conversionPattern value="%d{yyyy-MM-dd HH:mm:ss} - [%t] %-5p %c %x - %m%n" />
</layout>
</appender>
<appender name="Error" type="log4net.Appender.RollingFileAppender">
<threshold value="Error" />
<param name="File" value="App_Data\\Log\\Error.log"/>
<param name="AppendToFile" value="true"/>
<maximumFileSize value="5120KB"/>
<lockingModel type="log4net.Appender.FileAppender+MinimalLock" />
<maxSizeRollBackups value="1000"/>
<layout type="log4net.Layout.PatternLayout">
<conversionPattern value="%d{yyyy-MM-dd HH:mm:ss} - [%t] %-5p %c %x - %m%n" />
</layout>
</appender>
<root>
<appender-ref ref="Info" />
<appender-ref ref="Error" />
</root>
</log4net>
public TestClass(ILoggerFactory loggerFactory, IConfiguration config)
{
// create a class logger
_log = loggerFactory.CreateLogger<TestClass>();
// and whenever you need a new instance of a special class logger use this:
_subClassLog = loggerFactory.Create<SubTestClass>();
_config = config;
}
private static readonly ILogger<SubClass> _log;
private readonly IConfiguration _config;
public SubClass(ILoggerFactory loggerFactory, IConfiguration config)
{
_log = _log ??= loggerFactory.CreateLogger<SubClass>();
_config = config;
}