使用IHostingEnvironment的自定义名称

时间:2016-11-21 13:09:19

标签: c# asp.net-core asp.net-core-mvc

我们正在运行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");                 
}

这样做很好,但感觉有点危险,因为IsProductionIsStaging的默认方法现在不会按照您预期的方式工作。

处理与ASP.NET Core默认值不同的环境名称的正确方法是什么?

2 个答案:

答案 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