c# - 将 ILogger 或 ILoggerFactory 传递给 AspNet Core 中的构造函数?

标签 c# asp.net-core logging dependency-injection .net-core

MS 文档文章 "Introduction to Logging in ASP.NET Core"给出了2个构造函数注入(inject)的例子

  • 使用ILogger

    private readonly ILogger _logger;   
    public TodoController(ILogger<TodoController> logger)  
    { 
        _logger = logger;   
    }
    
  • ILoggerFactory

    private readonly ILogger _logger;  
    public TodoController( ILoggerFactory loggerFactory)  
    {  
        _logger = loggerFactory.CreateLogger<TodoController>();  
    }
    

我的问题是我应该将什么传递给从我的 Controller 调用的

  • ILoggerFactory 传递给从 Controller 调用的我的子类,并且 在每个类(class)电话中 LoggerFactoryExtensions.CreateLogger<MyChildClass>()或者

  • 传递父 Controller 的 ILogger<MyController> 给每个 child 类(class) 从 Controller 创建并具有非通用参数 ILogger。

在日志中,我更喜欢为每个类看到单独的类别“MyChildClass”,而不是所有类都使用父 Controller 中的类别“MyController”。
然而,每个对象构造中的 CreateLogger 可能是一项昂贵的操作(例如,参见 https://github.com/aspnet/Logging/issues/524)

您会推荐哪个选项?你能推荐任何其他方法吗?

最佳答案

这更像是一个设计问题。

无论如何 Controller 都不应该创建子类。这不是 Controller 应该处理的问题,并且违反了 SRP(单一责任原则)。

My question is what should I pass to child classes called from my controller

如果您的偏好是分离记录器,那么除了让子(依赖)类拥有自己的记录器外,别无选择。

让子类注入(inject)自己的记录器

public class TodoRepository : ITodoRepository {
    private readonly ILogger logger; 

    public TodoRepository(ILogger<TodoRepository> logger) { 
        this.logger = logger;   
    }
  
    //...
}

然后将子类注入(inject) Controller 。

public class TodoController : Controller {
    private readonly ILogger logger;
    private readonly ITodoRepository todoRepository;

    public TodoController(ILogger<TodoController> logger, ITodoRepository todoRepository) {
        this.logger = logger;   
        this.todoRepository = todoRepository;
    }

    //...
}

这样,当子类被解析并注入(inject) Controller 时,子记录器将被解析。

关于c# - 将 ILogger 或 ILoggerFactory 传递给 AspNet Core 中的构造函数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46013762/

相关文章:

c# - Visual Studio 中的缩进样式

c# - HttpWebRequest 密码套件选择

c# - 我什么时候应该使用 ServiceFabricIntegrationOptions.UseUniqueServiceUrl

logging - 使用 io.Multiwriter 跨包/子包创建日志

c++ - C++ 中的 WriteLog( ... ) 函数

c# - 使用相同 boolean 值的两种形式

c# - 使用 StackExchange.Redis 从 Redis 获取多个哈希值

c# - 使用HttpClient.GetFromJsonAsync(),如何处理基于HttpStatusCode的HttpRequestException而无需额外的SendAsync调用?

asp.net-core - 我可以在 ASP.net Core 2.0 Preview 的 appsettings.json 中设置监听 URL 吗?

java - 为新手在应用程序中记录 Facade 或 Logger