2016-11-21 4 views
2

Мы работаем с ASP.NET Core и с нетерпением ждем использования IHostingEnvironment.Использование пользовательских имен для 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?

ответ

1

Вы можете решить эту проблему, создав свою собственную реализацию. Я создал свой собственный 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... 
} 

Тогда моя реализация от IWorkingEnvironment с использованием ASP.NET 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... 
} 
+0

Спасибо. Мне бы очень понравилось использовать IHostingEnvironment, так как это означает, что новым разработчикам не нужно было бы знать, какой интерфейс использовать, но я полагаю, что это лучший подход с текущей (отсутствием) конфигурируемости HostingEnvironment – severin

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

+0

Спасибо за ваш ответ. Как вы сказали сами, это своего рода сумасшедший подход ученого, и в принципе нет «правильного способа сделать это», – severin