2016-11-21 4 views
2

Wir führen ASP.NET Core und verwenden IHostingEnvironment eifrig.Verwenden Sie benutzerdefinierte Namen für IHostingEnvironment

Aufgrund von Konventionen in unserer Organisation stimmen unsere Umgebungsnamen nicht mit denen der standardmäßigen IHostingEnvironment-Implementierung überein.

Um dies zu umgehen, haben wir die folgenden Erweiterungsmethoden gemacht:

public static class HostingEnvironmentExtensions 
{ 
     public static bool IsProd(this IHostingEnvironment env) => env.IsEnvironment("prod");    

     public static bool IsTest(this IHostingEnvironment env) => env.IsEnvironment("test");     
} 

Dies funktioniert gut, aber fühlt sich irgendwie gefährlich, weil die Standardmethoden IsProduction und IsStaging jetzt nicht über die Art und Weise arbeiten Sie würde erwarten von.

Welcher Art ist der richtige Umgang mit Umgebungsnamen, die sich von den ASP.NET Core-Standardwerten unterscheiden?

Antwort

1

Sie könnten dies lösen, indem Sie Ihre eigene Implementierung erstellen. Ich habe meine eigene IWorkingEnvironment Schnittstelle wie folgt aus:

public interface IWorkingEnvironment 
{ 
    string EnvironmentName { get; set; } 
} 

Und meine eigene 'bekannt' Umwelt-Namen:

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); 
} 

durch die Erweiterungsmethoden Gefolgt auf 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... 
} 

Dann meine Implementierung von IWorkingEnvironment mit dem ASP.NET IHostingEnvironment:

public class AspNetWorkingEnvironment : IWorkingEnvironment 
{ 
    private readonly IHostingEnvironment _hostingEnvironment; 

    public AspNetWorkingEnvironment(IHostingEnvironment hostingEnvironment) 
    { 
     _hostingEnvironment = hostingEnvironment; 
    } 

    public string EnvironmentName => _hostingEnvironment.EnvironmentName; 
} 

Jetzt alles, was wir tun müssen, ist die AspNetWorkingEnvironment als Implementierung von IWorkingEnvironment registrieren in unserer Dependency Injection Container (eine Singleton Lebensdauer verwenden):

public void ConfigureServices(IServiceCollection services) 
{ 
    services.AddSingleton<IWorkingEnvironment, AspNetWorkingEnvironment>(); 

    // etc... 
} 
+0

Danke. Ich wäre wirklich gerne in der Lage gewesen, IHostingEnvironment zu verwenden, da es bedeutet, dass neue Entwickler kein Wissen brauchen, welche Schnittstelle zu verwenden, aber ich nehme an, dies ist der beste Ansatz mit der aktuellen (Mangel an) Konfigurierbarkeit von HostingEnvironment – severin

1

Der sauberste Weg wäre, um Ihre eigene Art zu erweitern, die Arbeitsgeräte IHostingEnvironment und injizieren Sie es in Ihre Controller und Dienste.

Aber, wenn Sie auf Berufung auf die integrierten Methoden bestehen, können Sie (etwas gefährlich) überschreiben die string Werte im EnvironmentName Typ Ihre benutzerdefinierten Werte entsprechen:

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(); 

    // ... 
} 

Intern die integrierte in IsEnvironment() Methode verlässt sich auf die Werte von diesem EnvironmentName, um den Umgebungsnamen zu bestimmen.

Siehe Source

+0

Danke für deine Antwort. Wie du selbst gesagt hast, ist das ein verrückter Wissenschaftleransatz, und im Grunde gibt es keinen "richtigen Weg". – severin

Verwandte Themen