静态类的DI

时间:2019-08-23 21:48:05

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

我想在我的网站上记录错误。日志类需要IHostingEnvironment来获取日志文件路径。 DI仅适用于构造函数,而静态类没有构造函数。

我删除了静态函数并添加了构造函数,但是现在当我启动Log类时,构造函数在询问IHostingEnvironment参数。最后,我需要使用IHostingEnvironment我的所有控制器来使用日志类吗?

.net Core调用Controller类,而没有来自浏览器的参数。我该如何处理我的日志类?

目前就是这样。

public class LogServices
{
    public static void Log(string logMessage, IHostingEnvironment env)
    {
        string logName = env.WebRootPath + "\\Log\\Log_" + DateTime.Now.ToString("dd_MM_yyyy") + ".txt";
        using (StreamWriter w = File.AppendText(logName))
        {
            w.Write("\r ");
            w.WriteLine($"  :{logMessage}");
        }
    }
 }

但是我想要这样的东西:

public class LogServices
{
    public static void Log(string logMessage,[FromServices] IHostingEnvironment env)
    {
        string logName = env.WebRootPath + "\\Log\\Log_" + DateTime.Now.ToString("dd_MM_yyyy") + ".txt";
        using (StreamWriter w = File.AppendText(logName))
        {
            w.Write("\r ");
            w.WriteLine($"  :{logMessage}");
        }
    }
 }

如果这行得通,我可以这样调用日志文件

  LogServices.Log("Error bal balblaa");

但是显然它不起作用,因为LogServices.Log再次询问IHostingEnvironment参数。与第一个相似。

1 个答案:

答案 0 :(得分:4)

不要使用静态类。将您的注入类注册为单例,并在构造函数中要求IHostingEnvironment

public class LogServices
{
    private readonly IHostingEnvironment _env;

    public LogServices(IHostingEnvironment env)
    {
        _env = env;
    }

    public void Log(string logMessage)
    {
        string logName = _env.WebRootPath + "\\Log\\Log_" + DateTime.Now.ToString("dd_MM_yyyy") + ".txt";
        using (StreamWriter w = File.AppendText(logName))
        {
            w.Write("\r ");
            w.WriteLine($"  :{logMessage}");
        }
    }
}

然后在ConfigureServices中的Startup.cs方法中:

services.AddSingleton<LogServices>();

然后,在需要它的任何地方,都可以在构造函数中请求LogServices,它将被注入。

但是您也可以考虑使其从ILogger继承并使用内置的日志记录框架。您可以阅读有关here的信息。最大的好处是,每当您记录某些内容时,它都会写入每个注册的记录器中,而不仅仅是一个。因此,它仍然可以写入调试窗口以及您的自定义记录器,而无需任何额外的代码。

虽然涉及更多。有一个完整的示例,您可以创建自己的日志记录提供程序以写入文件here