MS docs "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 和
    在每堂课中LoggerFactoryExtensions.CreateLogger<MyChildClass>()
  • 将父 Controller 的 ILogger<MyController> 传递给每个子类
    由 Controller 创建并具有非通用参数ILogger。

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

    您会推荐哪个选项?您能建议其他方法吗?

    最佳答案

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

    如果您希望分开记录器,那么除了让子(依赖)类拥有自己的记录器之外,这里别无选择。
    让子类注入(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/

    10-17 02:31