ConfigureServices
スタートアップのメソッドで開発/ステージング/本番ホスティング環境を取得するにはどうすればよいですか?
public void ConfigureServices(IServiceCollection services)
{
// Which environment are we running under?
}
このConfigureServices
メソッドは単一のIServiceCollection
パラメーターのみを受け取ります。
ConfigureServices
スタートアップのメソッドで開発/ステージング/本番ホスティング環境を取得するにはどうすればよいですか?
public void ConfigureServices(IServiceCollection services)
{
// Which environment are we running under?
}
このConfigureServices
メソッドは単一のIServiceCollection
パラメーターのみを受け取ります。
回答:
ConfigureServicesで簡単にアクセスできます。最初に呼び出されて渡されるStartupメソッドの間にプロパティに永続化するだけで、ConfigureServicesからプロパティにアクセスできます。
public Startup(IHostingEnvironment env, IApplicationEnvironment appEnv)
{
...your code here...
CurrentEnvironment = env;
}
private IHostingEnvironment CurrentEnvironment{ get; set; }
public void ConfigureServices(IServiceCollection services)
{
string envName = CurrentEnvironment.EnvironmentName;
... your code here...
}
CurrentEnvironment.IsDevelopment()
/CurrentEnvironment.IsProduction()
環境ASPNETCORE_ENVIRONMENT
の名前で呼び出される環境変数を設定します(例:)Production
。次に、次のいずれかを行います。
IHostingEnvironment
しStartup.cs
、それ(env
ここ)を使用して確認しますenv.IsEnvironment("Production")
。を使用してチェックしないでくださいenv.EnvironmentName == "Production"
!Startup
クラスまたは個別のConfigure
/ ConfigureServices
関数を使用します。クラスまたは関数がこれらの形式に一致する場合、それらはその環境の標準オプションの代わりに使用されます。
Startup{EnvironmentName}()
(クラス全体) || 例:StartupProduction()
Configure{EnvironmentName}()
|| 例:ConfigureProduction()
Configure{EnvironmentName}Services()
|| 例:ConfigureProductionServices()
.NET Coreのドキュメントでは、これを実現する方法について説明しています。と呼ばれる環境変数を使用するASPNETCORE_ENVIRONMENT
設定されている、2つの選択肢があります。
この
IHostingEnvironment
サービスは、環境を操作するための中心的な抽象概念を提供します。このサービスはASP.NETホスティングレイヤーによって提供され、依存性注入を介してスタートアップロジックに注入できます。Visual StudioのASP.NET Core Webサイトテンプレートは、このアプローチを使用して、環境固有の構成ファイル(存在する場合)を読み込み、アプリのエラー処理設定をカスタマイズします。どちらの場合も、この動作は、適切なメソッドに渡されたのインスタンスEnvironmentName
またはIsEnvironment
を呼び出すことにより、現在指定されている環境を参照することで実現されますIHostingEnvironment
。
注:実際の値がチェックenv.EnvironmentName
されていないお勧めします!
アプリケーションが特定の環境で実行されているかどうかを確認する必要がある場合は、
env.IsEnvironment("environmentname")
大文字と小文字が正しく無視されるenv.EnvironmentName == "Development"
ため(たとえば、かどうかを確認する代わりに)を使用します。
ASP.NET Coreアプリケーションが起動すると、
Startup
クラスはアプリケーションのブートストラップ、その構成設定のロードなどに使用されます(ASP.NET起動の詳細をご覧ください)。ただし、名前が付けられたクラスStartup{EnvironmentName}
(たとえばStartupDevelopment
)が存在し、ASPNETCORE_ENVIRONMENT
環境変数がその名前と一致する場合は、Startup
代わりにそのクラスが使用されます。したがって、Startup
開発用に構成することはできますがStartupProduction
、アプリが本番環境で実行されるときに使用される別の構成を用意できます。またはその逆。
Startup
現在の環境に基づいて完全に別個のクラスを使用することに加えて、Startup
クラス内でのアプリケーションの構成方法を調整することもできます。方法と同様の環境に固有のバージョンのサポートフォームのクラス自体を、そして。メソッドを定義すると、環境が開発に設定されたときではなく、メソッドが呼び出されます。同様に、同じ環境ではなく呼び出されます。Configure()
ConfigureServices()
Startup
Configure{EnvironmentName}()
Configure{EnvironmentName}Services()
ConfigureDevelopment()
Configure()
ConfigureDevelopmentServices()
ConfigureServices()
では.NET Core 2.0
MVCアプリ/Microsoft.AspNetCore.All
v2.0.0デベロッパー、あなたは@vaindilによって記載されているように、環境固有のスタートアップクラスを持つことができますが、私はそのアプローチが好きではありません。
あなたはまた、注入することができIHostingEnvironment
へStartUp
コンストラクタ。Program
クラスに環境変数を格納する必要はありません。
public class Startup
{
private readonly IHostingEnvironment _currentEnvironment;
public IConfiguration Configuration { get; private set; }
public Startup(IConfiguration configuration, IHostingEnvironment env)
{
_currentEnvironment = env;
Configuration = configuration;
}
public void ConfigureServices(IServiceCollection services)
{
......
services.AddMvc(config =>
{
// Requiring authenticated users on the site globally
var policy = new AuthorizationPolicyBuilder()
.RequireAuthenticatedUser()
.Build();
config.Filters.Add(new AuthorizeFilter(policy));
// Validate anti-forgery token globally
config.Filters.Add(new AutoValidateAntiforgeryTokenAttribute());
// If it's Production, enable HTTPS
if (_currentEnvironment.IsProduction()) // <------
{
config.Filters.Add(new RequireHttpsAttribute());
}
});
......
}
}
これは、次のように追加のプロパティやメソッドパラメータなしで実現できます。
public void ConfigureServices(IServiceCollection services)
{
IServiceProvider serviceProvider = services.BuildServiceProvider();
IHostingEnvironment env = serviceProvider.GetService<IHostingEnvironment>();
if (env.IsProduction()) DoSomethingDifferentHere();
}
ドキュメントごと
ConfigureおよびConfigureServicesは、Configure {EnvironmentName}およびConfigure {EnvironmentName} Services形式の環境固有のバージョンをサポートします。
あなたはこのようなことをすることができます...
public void ConfigureProductionServices(IServiceCollection services)
{
ConfigureCommonServices(services);
//Services only for production
services.Configure();
}
public void ConfigureDevelopmentServices(IServiceCollection services)
{
ConfigureCommonServices(services);
//Services only for development
services.Configure();
}
public void ConfigureStagingServices(IServiceCollection services)
{
ConfigureCommonServices(services);
//Services only for staging
services.Configure();
}
private void ConfigureCommonServices(IServiceCollection services)
{
//Services common to each environment
}
私は自分のサービスの1つに環境を取り入れたかったのです。とても簡単です!私はそれを次のようにコンストラクタに注入するだけです:
private readonly IHostingEnvironment _hostingEnvironment;
public MyEmailService(IHostingEnvironment hostingEnvironment)
{
_hostingEnvironment = hostingEnvironment;
}
後でコードでこれを行うことができます:
if (_hostingEnvironment.IsProduction()) {
// really send the email.
}
else {
// send the email to the test queue.
}
上記のコードは.NET Core 2用IWebHostEnvironment
です。バージョン3の場合はを使用します。
ホスティング環境は、ASPNET_ENV環境変数から取得されます。ASPNET_ENV環境変数は、IHostingEnvironment.IsEnvironment拡張メソッド、またはIsDevelopmentまたはIsProductionの対応する便利なメソッドの1つを使用して起動時に使用できます。必要なものをStartup()に保存するか、ConfigureServices呼び出しに保存します。
var foo = Environment.GetEnvironmentVariable("ASPNET_ENV");
IHostingEnvironment
では利用できませんConfigureServices
。
誰かがこれも探している場合に備えて。.net core 3+では、これのほとんどは廃止されています。更新方法は次のとおりです。
public void Configure(
IApplicationBuilder app,
IWebHostEnvironment env,
ILogger<Startup> logger)
{
if (env.EnvironmentName == Environments.Development)
{
// logger.LogInformation("In Development environment");
}
}
Dotnet Core 2.0では、Startup-constructorはIConfiguration-parameterのみを想定しています。
public Startup(IConfiguration configuration)
{
Configuration = configuration;
}
そこでホスティング環境を読むには?ConfigureAppConfiguration中にProgram-classに保存します(WebHost.CreateDefaultBuilderの代わりに完全なBuildWebHostを使用します)。
public class Program
{
public static IHostingEnvironment HostingEnvironment { get; set; }
public static void Main(string[] args)
{
// Build web host
var host = BuildWebHost(args);
host.Run();
}
public static IWebHost BuildWebHost(string[] args)
{
return new WebHostBuilder()
.UseConfiguration(new ConfigurationBuilder()
.SetBasePath(Directory.GetCurrentDirectory())
.AddJsonFile("hosting.json", optional: true)
.Build()
)
.UseKestrel()
.UseContentRoot(Directory.GetCurrentDirectory())
.ConfigureAppConfiguration((hostingContext, config) =>
{
var env = hostingContext.HostingEnvironment;
// Assigning the environment for use in ConfigureServices
HostingEnvironment = env; // <---
config
.AddJsonFile("appsettings.json", optional: true, reloadOnChange: true)
.AddJsonFile($"appsettings.{env.EnvironmentName}.json", optional: true, reloadOnChange: true);
if (env.IsDevelopment())
{
var appAssembly = Assembly.Load(new AssemblyName(env.ApplicationName));
if (appAssembly != null)
{
config.AddUserSecrets(appAssembly, optional: true);
}
}
config.AddEnvironmentVariables();
if (args != null)
{
config.AddCommandLine(args);
}
})
.ConfigureLogging((hostingContext, builder) =>
{
builder.AddConfiguration(hostingContext.Configuration.GetSection("Logging"));
builder.AddConsole();
builder.AddDebug();
})
.UseIISIntegration()
.UseDefaultServiceProvider((context, options) =>
{
options.ValidateScopes = context.HostingEnvironment.IsDevelopment();
})
.UseStartup<Startup>()
.Build();
}
AntはそれをConfigureServicesで次のように読み取ります。
public IServiceProvider ConfigureServices(IServiceCollection services)
{
var isDevelopment = Program.HostingEnvironment.IsDevelopment();
}
IHostingEnvironment
ConfigureServicesに注入できないのですか?見落とし?または私たちが知っておく必要がある理由は?