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

MiF*_*vil 21 c# logging dependency-injection .net-core asp.net-core

MS文档文章"ASP.NET Core中的日志记录简介"提供了2个构造函数注入示例

我的问题是我应该传递给从我的控制器调用的

  • 通过ILoggerFactory我从控制器和每种类别的呼叫称为子类 LoggerFactoryExtensions.CreateLogger<MyChildClass>()

  • 将父控制器传递ILogger<MyController>给从控制器创建的每个子类,并具有非泛型参数ILogger.

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

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

Nko*_*osi 14

这更像是一个设计问题.

无论如何,控制器不应该创建子类.这不是控制器应该处理的问题,而是违反SRP(单一责任原则).

我的问题是我应该传递给从我的控制器调用的子类

如果您希望将记录器分开,那么这里没有任何其他选择,只能让子(依赖)类具有自己的记录器.

让子类注入自己的记录器

public class TodoRepository : ITodoRepository {
    private readonly ILogger logger; 

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

    //...
}
Run Code Online (Sandbox Code Playgroud)

然后将子类注入控制器.

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

    //...
}
Run Code Online (Sandbox Code Playgroud)

这样,当子类被解析并注入控制器时,子记录器将得到解决.