如何从.net core中的控制器在新类对象中提供 ILogger<ClassName> 实例?

Cod*_*Guy 3 .net c# logging asp.net-core ilogger

当给出 null 时,它给出 Value 不能为 null。(参数“记录器”)错误。 即使给出模型实例,它仍然保持为空

 public class MyController : Controller
    {
            public MyController(ILogger<MyController> logger)
            {
              logger.LogInformation("Log Testing");
            }

            public ActionResult List()
            {
                int Id = 5;
                MyModel model = new MyModel(null);
                model.GetItem(Id);
                return View("List", model);
            }
    }

public class MyModal:BaseModel
{
    private readonly ILogger<MyModal> _logger;
    public MyModel(ILogger<MyModel> logger) 
        {
           this._logger = logger;
        }

    public MyModel GetItem (Int Id)
    {
      try
      {
        //My Code
      }
      catch(Exception e){
       _logger.LogError(e.Message);
      }
    }
}
Run Code Online (Sandbox Code Playgroud)

根据建议我编辑了我的问题

Joh*_*ica 9

正如评论中所建议的:

  1. 注入ILoggerFactory并将MyController其存储在字段变量中(例如_loggerFactory)。
  2. 使用工厂MyModel在您的List方法中构造一个记录器:ILogger<MyModel> modelLogger = _loggerFactory.CreateLogger<MyModel>();
  3. 将其传递到MyModel构造函数中:MyModel model = new MyModel(modelLogger);

例子:

public class MyController
{
    private readonly ILogger _logger;
    private readonly ILoggerFactory _loggerFactory;
    
    public MyController(ILogger<MyController> logger, ILoggerFactory loggerFactory)
    {
        _logger = logger;
        _loggerFactory = loggerFactory;
    }

    public ActionResult List()
    {
        int Id = 5;
        ILogger<MyModel> modelLogger = _loggerFactory.CreateLogger<MyModel>();
        MyModel model = new MyModel(modelLogger);
        model.GetItem(Id);
        return View("List", model);
    }
}
Run Code Online (Sandbox Code Playgroud)

在线尝试一下