在 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
访问IHostingEnvironment
或IWebHostEnvironment
:
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 实例?