如何使用IHostingEnvironment

时间:2016-12-03 10:22:45

标签: .net asp.net-core

如何在不在构造函数中启动它的情况下使用IHostingEnvironment接口?

我的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); 
    }
}

1 个答案:

答案 0 :(得分:13)

您应该使用集成依赖注入,因为它可以使代码解耦并更容易更改,而不会破坏内容并使单元测试变得非常容易。

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

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

 dimens.xml :
 <string name="id" type="string">ID</string>

 strings.xml (w820 db)
 <string name="id" type="string">ID</string>

如果构造函数中的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中自行注册,如果ASP.NET Core尚未执行此操作:

Startup.cs

其中env是传递给services.AddSingleton<IHostingEnvironment>(env); 构造函数的实例。