Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/317.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# .NET核心DI和子类_C#_.net Core_Dependency Injection_Log4net_Asp.net Core 5.0 - Fatal编程技术网

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;
    }