«Microsoft.Extensions.DependencyInjection»
List of "environments"
Production
Uat
Qa
DevShared
LocalDev
В DotNet (Framework / Classic) версии 4.6 или выше (иначе, «в прошлом») я использовал «Unity» с конфигурацией xml. https://blogs.msdn.microsoft.com/miah/2009/04/03/testing-your-unity-xml-configuration/
(В прошлом до ядра Dot Net при использовании IoC / DI "Unity") ... Когда у меня была необходимость иметь конкретный конкретный для среды, я настраивал конкретный в .xml.Например, допустим, что моему webApi требовалась аутентификация на производстве, uat, qa и dev-shared. Но в dev-local я не хочу иметь дело с аутентификацией все время, так как я разрабатывал webApi, у меня было бы 2 бетона.
IAuthorizer
MyRealAuthorizer : IAuthorizer
MyDevLetEverythingThroughAuthorizer : IAuthorizer
и я бы "зарегистрировал" одну из них .. используя xml.
Мой процесс сборки изменил бы unity.xml (unity.config, если быть точным) и изменился бы (черезxml-update-tasks в msbuild)
MyDevLetEverythingThroughAuthorizer
до
MyRealAuthorizer
.
.....
Java Spring имеет "аннотацию" на основе:
import org.springframework.context.annotation.Profile;
@Profile("localdev")
public class MyDevLetEverythingThroughAuthorizer implements IAuthorizer {
@Profile("!localdev")
public class MyRealAuthorizer implements IAuthorizer {
Но это не соблюдает шаблон «составного корня»: (Марк Симан http://blog.ploeh.dk/2011/07/28/CompositionRoot/)
.......
Так что теперь я вхожу вмир DotNetCore.Все прошло гладко.Но в конце концов я попал в ситуацию, когда мне нужен бетон, дружественный к разработчикам, а не «настоящие» бетоны не-dev.
XML не доступен (насколько мне известно) с «Microsoft.Extensions.DependencyInjection».
Я не уверен в лучшей практике с DotNetCore в этой ситуации.
Я бы предпочел соблюдать шаблон Composite Root.
В основном, ниже ...... но с учетом окружающей среды.
asp.net'ish
public void ConfigureServices(Microsoft.Extensions.DependencyInjection.IServiceCollection services)
{
services.AddMvc().SetCompatibilityVersion(CompatibilityVersion.Version_2_1);
/* need this for "local-dev" */
services.AddScoped<IAuthorizer, MyDevLetEverythingThroughAuthorizer>();
/* need this for everything EXCEPT "local-dev" */
services.AddScoped<IAuthorizer, MyRealAuthorizer>();
}
(не asp.net) dot.net core'ish тоже
private static System.IServiceProvider BuildDi()
{
//setup our DI
IServiceProvider serviceProvider = new ServiceCollection()
.AddLogging()
/* need this for "local-dev" */
.AddSingleton<IAuthorizer, MyDevLetEverythingThroughAuthorizer>()
/* need this for everything EXCEPT "local-dev" */
.AddSingleton<IAuthorizer, MyRealAuthorizer>()
ПРИЛОЖЕНИЕ
Эта статья и фрагмент помогают мне немного лучше понять часть «что встроено»:
https://docs.microsoft.com/en-us/aspnet/core/fundamentals/environments?view=aspnetcore-2.2
Среды, которые читает ASP.NET Coreпеременная среды ASPNETCORE_ENVIRONMENT при запуске приложения и сохраняет значение в IHostingEnvironment.EnvironmentName.Вы можете установить ASPNETCORE_ENVIRONMENT на любое значение, но три значения поддерживаются платформой: Разработка, Подготовка и Производство.Если ASPNETCORE_ENVIRONMENT не установлен, по умолчанию используется значение Production.
public void Configure(IApplicationBuilder app, IHostingEnvironment env)
{
if (env.IsDevelopment())
{
app.UseDeveloperExceptionPage();
}
if (env.IsProduction() || env.IsStaging() || env.IsEnvironment("Staging_2"))
{
app.UseExceptionHandler("/Error");
app.UseHsts();
}
app.UseHttpsRedirection();
app.UseStaticFiles();
app.UseCookiePolicy();
app.UseMvc();
}
env.IsEnvironment ("Staging_2") (сродни env.IsEnvironment ("MyCustomValue")) это хитрость, я думаю.
APPEND:
Этот вопрос SOF прояснил Asp.Net Core.
Как установить aspnetcore_environment в файле публикации?
И как вы можете установить переменную окружения без фактической установки (машинной) переменной окружения!