我们正在运行ASP.NET Core并急切地使用IHostingEnvironment。
由于我们组织中的惯例,我们的环境名称与默认IHostingEnvironment实施的名称不匹配。
为了解决这个问题,我们制定了以下扩展方法:
public static class HostingEnvironmentExtensions
{
public static bool IsProd(this IHostingEnvironment env) => env.IsEnvironment("prod");
public static bool IsTest(this IHostingEnvironment env) => env.IsEnvironment("test");
}
这样做很好,但感觉有点危险,因为IsProduction
和IsStaging
的默认方法现在不会按照您预期的方式工作。
处理与ASP.NET Core默认值不同的环境名称的正确方法是什么?
答案 0 :(得分:2)
您可以通过创建自己的实现来解决此问题。我创建了自己的IWorkingEnvironment
界面,如下所示:
public interface IWorkingEnvironment
{
string EnvironmentName { get; set; }
}
我自己的'已知'环境名称:
public static class EnvironmentNames
{
public static readonly string Local = nameof(Local);
public static readonly string Dev = nameof(Dev);
public static readonly string Test = nameof(Test);
public static readonly string Prod = nameof(Prod);
}
关注IWorkingEnvironment
上的扩展方法:
public static class WorkingEnvironmentExtensions
{
public static bool IsLocal(this IWorkingEnvironment environment)
{
return environment.EnvironmentName == EnvironmentNames.Local;
}
public static bool IsDev(this IWorkingEnvironment environment)
{
return environment.EnvironmentName == EnvironmentNames.Dev;
}
// etc...
}
然后使用ASP.NET IWorkingEnvironment
:
IHostingEnvironment
public class AspNetWorkingEnvironment : IWorkingEnvironment
{
private readonly IHostingEnvironment _hostingEnvironment;
public AspNetWorkingEnvironment(IHostingEnvironment hostingEnvironment)
{
_hostingEnvironment = hostingEnvironment;
}
public string EnvironmentName => _hostingEnvironment.EnvironmentName;
}
现在我们所要做的就是在我们的依赖注入容器中注册AspNetWorkingEnvironment
作为IWorkingEnvironment
的实现(使用单例生存期):
public void ConfigureServices(IServiceCollection services)
{
services.AddSingleton<IWorkingEnvironment, AspNetWorkingEnvironment>();
// etc...
}
答案 1 :(得分:1)
最简洁的方法是扩展您自己的实现IHostingEnvironment
的类型并将其注入您的控制器和服务。
但是,如果您坚持依赖内置方法,则可以(有点危险)覆盖string
类型中的EnvironmentName
值以匹配您的自定义值:
public Startup(IHostingEnvironment env)
{
var envNameType = typeof(EnvironmentName);
envNameType.GetField(EnvironmentName.Development).SetValue(null, "dev");
envNameType.GetField(EnvironmentName.Production).SetValue(null, "prod");
envNameType.GetField(EnvironmentName.Staging).SetValue(null, "stag");
// given that current environment name == "prod", both would evaluates to 'true'
var isInProd = env.IsEnvironment("prod");
var isProd = env.IsProduction();
// ...
}
在内部,内置IsEnvironment()
方法依赖于EnvironmentName
的值来确定环境名称。
请参阅Source