C# 在非控制器模型上传递Ilogger

C# 在非控制器模型上传递Ilogger,c#,asp.net-core,asp.net-core-mvc,nlog,C#,Asp.net Core,Asp.net Core Mvc,Nlog,我正在.net core中创建一个应用程序,并试图输出一个日志 我能够记录控制器的输出,我还想记录模型的输出,如下所示 不幸的是,我不知道将什么作为参数传递给构造函数。我的猜测与控制器相同,但我想知道是否有正确的方法 提前谢谢 控制器: public class SampleController : Controller { public readonly ILogger<SampleController > _logger; public SampleControl

我正在.net core中创建一个应用程序,并试图输出一个日志

我能够记录控制器的输出,我还想记录模型的输出,如下所示

不幸的是,我不知道将什么作为参数传递给构造函数。我的猜测与控制器相同,但我想知道是否有正确的方法

提前谢谢

控制器:

public class SampleController : Controller {
    public readonly ILogger<SampleController > _logger;
    public SampleController (ILogger<SampleController > logger)
    {
        _logger = logger;
    }


    [HttpGet("[action]")]
    public string FindSample()
    {
        _logger.LogInformation("FindSample Start");

        // ***** Is it necessary to carry over the log of the sample controller to a much lower DAO from here? *****
        var model = new SampleModel(_logger);
        var result = model.Find();

        _logger.LogInformation("FindSample End");
        return result;
    }
}
公共类示例控制器:控制器{
公共只读ILogger\u记录器;
公共采样控制器(ILogger记录器)
{
_记录器=记录器;
}
[HttpGet(“[action]”)
公共字符串FindSample()
{
_logger.LogInformation(“FindSample Start”);
//******是否有必要从此处将示例控制器的日志传递到更低的DAO*****
var模型=新样本模型(_logger);
var result=model.Find();
_logger.LogInformation(“FindSample End”);
返回结果;
}
}
型号:

    public class SampleModel
    {
        public readonly ILogger<SampleController> _logger;
        public SampleModel(ILogger<SampleController> logger)
        {
            _logger = logger;
        }

        public string Find()
        {
            _logger.LogInformation("FindModel Start");

            var dao = new SampleDao(_logger);
            var code = dao.GetCode();

            _logger.LogInformation("FindModel End");
            return code;
        }
    }
公共类样本模型
{
公共只读ILogger\u记录器;
公共样本模型(ILogger记录器)
{
_记录器=记录器;
}
公共字符串Find()
{
_logger.LogInformation(“FindModel启动”);
var dao=新的SampleDao(_logger);
var code=dao.GetCode();
_logger.LogInformation(“FindModel End”);
返回码;
}
}
道:

公共类SampleDao
{
公共只读ILogger\u记录器;
公共样本上下文样本上下文;
//******我应该把它作为一个论点永远通过吗*****
公共样本道(ILogger记录器)
{
_记录器=记录器;
if(SampleContext==null)
{
SampleContext=新的SampleContext();
}
}
公共字符串GetCode()
{
_logger.LogInformation(“GetCode启动”);
var code=SampleContext.SampleTable.FirstOrDefault().code;
_logger.LogInformation(“GetCode结束”);
返回码;
}
}

您应该将正在注入记录器的类作为通用参数传递。因此,您应该使用:

在你的道中

ILogger记录器
在您的型号中

ILogger记录器
有关更多信息,请查看:

默认情况下,
WebHost.CreateDefaultBuilder(args)
注入
控制台
调试
事件源
记录器提供程序。因此,我认为您可以通过构造函数注入安全地注入
ILogger
,在这之后的任何地方?理想情况下,您应该通过构造函数注入和日志一起注入所有这些紧密耦合的实例化谢谢您的评论。很抱歉,我正在翻译和查看评论,因此我可能没有正确理解。提供程序已添加,请参考以下URL。在参考URL中,我认为有一个关于“AboutModel”的描述,我无法理解应该传递什么作为构造函数的参数,因为在任何情况下AboutModel都不是新的。谢谢你的回复。我还看到了参考URL,如果我的理解还不够,而且它实际上是新的,那么模型构造函数不知道从哪里获取日志记录器并传入参数。好的。现在我明白了。该模型显然不是通过依赖项注入,而是通过new()创建的。您可以使用您的方法和控制器,但它会将您的模型与控制器类紧密耦合,这是一个非常复杂的问题。您可以尝试的另一件事是在控制器中插入两个ILogger实例,一个类型为
SampleController
,另一个类型为
SampleModel
,然后当您在控制器中创建模型时,将ILogger实例传递给模型的构造函数,这是否意味着您通常不使用new?在另一个网站上,我也看到了类似“services.AddTransient”之类的东西。在这种情况下,所有模型和Dao都必须注册是一条线索。如果你回答的话,会是这样吗?公共采样控制器(ILogger logger、ILogger modelLogger、ILogger daoLogger)var模型=新的采样模型(modelLogger、daoLogger);如果翻译成粗鲁的英语,我很抱歉。当我第一次回答时,我感到困惑。但我总是使用新的模型。像服务这样的东西通常是通过依赖注入创建的,但是像模型这样的东西应该用new手工创建毕竟,我也认为这很奇怪。对于控制器,与之前在模型中使用的方法相同,分别创建一个基本模型和“LogManager.LoadConfiguration(“nlog.config”).GetLogger(GetType().ToString());”以及控制器的记录器,而不必持有记录器。
    public class SampleDao
    {
        public readonly ILogger<SampleController> _logger;
        public SampleContext SampleContext;

        // ***** Should I pass it as an argument forever? *****
        public SampleDao(ILogger<SampleController> logger)
        {
            _logger = logger;
            if (SampleContext == null)
            {
                SampleContext = new SampleContext();
            }
        }

        public string GetCode()
        {
            _logger.LogInformation("GetCode Start");

            var code = SampleContext.SampleTable.FirstOrDefault().code;

            _logger.LogInformation("GetCode End");
            return code;
        }
    }