在 ConfigureServices 方法中访问 IHostingEnvironment

Posted

技术标签:

【中文标题】在 ConfigureServices 方法中访问 IHostingEnvironment【英文标题】:Accessing the IHostingEnvironment in ConfigureServices method 【发布时间】:2016-06-06 14:28:30 【问题描述】:

我需要在ConfigureServices 方法中检查当前托管环境名称是否为“开发”。

所以使用IHostingEnvironment.IsDevelopment() 方法对我来说可能没问题,但与配置方法不同,我没有IHostingEnvironment env

【问题讨论】:

这能回答你的问题吗? How to get the Development/Staging/production Hosting Environment in ConfigureServices 【参考方案1】:

只需在 Startup 类中创建一个属性来持久化 IHostingEnvironment。在你已经可以访问的 Startup 构造函数中设置属性,然后你可以从 ConfigureServices 访问该属性

【讨论】:

即使Asp.Net Core 2.0的新项目模板在Startup构造函数中不包含参数“IHostingEnvironment env”,也可以指定,并正确注入。 为什么在ConfigureServices 是不可能的? @Alexsandro_xpt 在ConfigureServices 上记录您的问题的答案,这是不可能的,因为该框架不支持该特定方法的依赖注入,就像它在其他领域所做的那样(可能是因为您使用这个方法来配置依赖注入)。正如乔所描述的那样在构造函数级别设置应该可以解决这个问题。 @MarkG 不幸的是,该答案已被删除……其 Q 已被标记为该答案的副本。所以包括这里... 从 .NET 5 开始,IHostingEnvironment 已弃用,您需要改用 IWebHostEnvironment。【参考方案2】:

从问题marked as duplicate of this one and deleted 复制到这里。感谢a-ctor。

如果您想在ConfigureServices 中访问IHostingEnvironment,则必须通过构造函数将其注入并将其存储在ConfigureServices 中以供以后访问:

public class Startup

    public Startup(IConfiguration configuration, IHostingEnvironment environment)
    
        Configuration = configuration;
        Environment = environment;
    

    public IConfiguration Configuration  get; 

    public IHostingEnvironment Environment  get; 

    public void ConfigureServices(IServiceCollection services)
    
        services.AddMvc();

        System.Console.WriteLine($"app: Environment.ApplicationName");
    

    // rest omitted

【讨论】:

嗨,这没什么大不了的,但在格式化的字符串中,environment 是小写的,而属性似乎是 Environment @BenSmith 我相信你有错字。您在声明中重复了 IHostingEnvironment “IHostingEnvironment 现在已过时,应使用 IHostingEnvironment。什么是 IHostingEnvironment 的正确替代品? 噢!好地方@Blake。我会删除我之前的评论。我的评论应该是“IHostingEnvironment 现在已经过时,应该使用 IWebHostEnvironment”。 更清楚一点,不应该说IHostingEnvironment.Net Core 3.0 之前就已经过时了吗? (我正在做一个“带回家的测试”,它在 ConfigureServices() 方法中调用 services.AddMvc().SetCompatibilityVersion(CompatibilityVersion.Version_2_2); 并且 IHostingEnvironment 工作正常。 @ScottFraley 正确。由于这个问题和答案来自 .NET Core 2.x 时间框架(许多项目将继续使用相当长的一段时间),它仍然适用。【参考方案3】:

IHostingEnvironment 在 Core 3.1 中已弃用

        private readonly IWebHostEnvironment _env;
   
        public Startup(IConfiguration configuration, IWebHostEnvironment env)
        
            _env = env;
            Configuration = configuration;
        

应该做的伎俩...

然后在任何地方引用_env.IsDevelopment() 等...

【讨论】:

【参考方案4】:

如果您没有使用Startup 类并且直接调用.Configure(),则可以使用GetService 访问IHostingEnvironmentIWebHostEnvironment

ASP.NET Core 2.2:

.Configure(app => 
    var hostingEnvironment = app.ApplicationServices.GetService<IHostingEnvironment>();
    if (hostingEnvironment?.IsDevelopment() == true)
    
        app.UseDeveloperExceptionPage();
    

    // .. Other stuff
);

ASP.NET Core 3.x:

.Configure(app => 
    var hostingEnvironment = app.ApplicationServices.GetService<IWebHostEnvironment>();
    if (hostingEnvironment?.IsDevelopment() == true)
    
        app.UseDeveloperExceptionPage();
    

    // .. Other stuff
);

【讨论】:

【参考方案5】:

如果您没有 Startup 类(您可能正在创建服务),您可以从 ConfigureServices 中的 hostContext 获取环境,如下所示:

 public static IHostBuilder CreateHostBuilder(string[] args) =>
            Host.CreateDefaultBuilder(args)
                .ConfigureServices((hostContext, services) =>
                
                    IConfiguration config = hostContext.Configuration;
                    Configuration = config;

                    var env = hostContext.HostingEnvironment;
                    EnvironmentName = env?.EnvironmentName;

...

【讨论】:

以上是关于在 ConfigureServices 方法中访问 IHostingEnvironment的主要内容,如果未能解决你的问题,请参考以下文章

在 Startup.cs 中使 ConfigureServices 方法异步

在另一个类文件中编写 ConfigureServices 方法

如何在 ConfigureServices 中解析 IOptions 实例?

如何在 ConfigureServices 中解析 IOptions 实例?

在 ASP.NET Core 的 ConfigureServices 阶段实际读取 AppSettings

如何正确解析要在 ASP.NET Core 3.1 的 ConfigureServices() 中使用的服务?