.net - 如何使用 IHostingEnvironment

标签 .net asp.net-core

如何使用 IHostingEnvironment接口(interface)而不在构造函数中启动它?

我的 Startup.cs:

public Startup(IHostingEnvironment env)
{
    var builder = new ConfigurationBuilder()
        .SetBasePath(env.ContentRootPath)
        .AddJsonFile("appsettings.json", optional: true, reloadOnChange: true)
        .AddJsonFile($"appsettings.{env.EnvironmentName}.json", optional: true)
        .AddEnvironmentVariables();

    if (env.IsDevelopment())
    {
        // This will push telemetry data through Application Insights pipeline faster, allowing you to view results immediately.
        builder.AddApplicationInsightsSettings(developerMode: true);
    }
    Configuration = builder.Build();
}

我的课:
public class FileReader
{
    // I don't want to initiate within a constructor

    public string ReadFile(string fileName)
    {
       // this is wrong! how can I use it?
       var filename = Path.Combine(IHostingEnvironment.WebRootPath, fileName); 
    }
}

最佳答案

您应该使用集成的依赖注入(inject),因为它使您的代码解耦并且更容易在不破坏内容的情况下进行更改,并且使单元测试变得非常容易。

如果您将通过静态类或方法访问它,那么您的代码将变得难以测试,因为在单元测试中它将始终使用项目路径而不是某些特定的字符串进行测试。

你描述的方式绝对正确,它是不是 错误的!下面只是完整的例子。

public class FileReader
{
    private readonly IHostingEnvironment env;
    public FileReader(IHostingEnvironment env)
    {
        if(env==null)
            throw new ArgumentNullException(nameof(env));

        this.env = env;
    }

    public string ReadFile(string fileName)
    {
       var filename = Path.Combine(env.WebRootPath, fileName);
    }
}

如果 env值为 null在构造函数中,您可能需要自己在 Startup.cs 中注册它,如果 ASP.NET Core 还没有这样做:
services.AddSingleton<IHostingEnvironment>(env);

其中 env 是传递给 Startup 的实例构造函数。

关于.net - 如何使用 IHostingEnvironment,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40946685/

相关文章:

c# - 如何判断用户何时从 Windows 的 Ctrl-Alt-Del 屏幕返回

java - 使用 RSA 从 C# 到 Java 的 Base64 编码字符串到公钥

javascript - 是什么导致 empty() 和 append() 不起作用?

javascript - Hub 方法仅运行一次

c# - Asp.Net vNext 在现有应用程序中自托管

c# - 如何生成从搜索页面模型查询所有非空属性的 LINQ 查询

android - ASP.Net 响应式网页设计或 native 移动应用程序

c# - 如何在 C# 中解码包含 XML 文档的 base64 编码字符串,该文档包含带有重音符号 (á,é,í,ó,ú) 的字符?

c# - 应用找不到位于另一个项目中的 Razor 页面

c# - 我如何知道所有控件何时加载并显示?