2017-04-18 85 views
0

在我的ASP.NET Core項目中,我依靠命令行參數來覆蓋默認url並覆蓋環境設置。通過ConfiguratonBuilder獲取主機環境?

DOTNET手錶運行--server.urls = https://localhost:5001 --environment 「本地主機」

我用CommandLineConfigurationExtensions到args添加到ConfigurationBuilder。這工作得很好,但我也想使用內置配置

public class Program 
{ 
    public static void Main(string[] args) 
    { 
     var configuration = new ConfigurationBuilder() 
      .AddCommandLine(args) 
      .Build(); 

     // More stuff happens with WebHostBuilder, 
     // and I would very much like to check the 
     // environment here. 
    } 
} 

我想訪問相同的環境設置,都可以通過在Startup類的Configure()方法IHostingEnvironment env參數。但我想這樣做在Main()

我意識到我可以只是解析命令行參數,並尋找自己的值,或從configuration可變我剛剛建立拉適當的值。然而,當在框架的任何部分中神奇地實例化實現我們其他人使用的接口的類時,顯然存在一種標準化的方法似乎不太合適。

回答

1

您可以直接使用config["environment"]或者如果沒有指定,則將Hosting.EnvironmentName.Production設置爲默認值。

讓我解釋一下爲什麼。

如果你看看IHostingEnvironmentimplementation,你會看到EnvironmentName是一個簡單的屬性與公共的getter/setter,默認情況下,它包含了Production值:

public class HostingEnvironment : IHostingEnvironment 
{ 
    public string EnvironmentName { get; set; } = Hosting.EnvironmentName.Production; 
    ... 
} 

然後值可以改變時Initializeextension method叫做。從WebHostOptions option使用數據:

hostingEnvironment.EnvironmentName = 
    options.Environment ?? 
    hostingEnvironment.EnvironmentName; 

更具體地講,在option.Environment財產is used,即

public WebHostOptions(IConfiguration configuration) 
{ 
    ... 
    Environment = configuration[WebHostDefaults.EnvironmentKey]; 
    ... 
} 

其中WebHostDefaults.EnvironmentKey

public static class WebHostDefaults 
{ 
    public static readonly string EnvironmentKey = "environment"; 
} 

所以environment密鑰從配置源用於指定主機環境。

+0

只要'config [「environment」]'「合併」來設置當前環境,我很高興使用它。感謝您的洞察!它爲我提供了非常需要的信心:) –