«Microsoft.Extensions.DependencyInjection» и различные бетоны для каждой среды - PullRequest
0 голосов
/ 03 декабря 2018

«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 в файле публикации?

И как вы можете установить переменную окружения без фактической установки (машинной) переменной окружения!

Ответы [ 2 ]

0 голосов
/ 03 декабря 2018

Ваш вопрос, кажется, говорит о двух вещах: настройка конфигурации из файлов XML и управление службами с использованием IServiceCollection.Для основных веб-приложений .net это происходит в два этапа:

  1. Пара ключ-значение консолидируется из различных предопределенных и пользовательских источников (включая json, XML, среду).Все предустановленные основные веб-шаблоны .net делают это в program.cs.

  2. Коллекция пар ключ-значение отправляется в класс Startup, к которому можно получить доступ через DI из переменной IConfiguration.Проверьте эту ссылку для получения дополнительной информации.

При этом процессе все файлы конфигурации добавляются до вызова метода ConfigureServices в классе Startup.Если вы хотите добавить файлы XML в эту конфигурацию, вы можете установить следующий код в вашем program.cs:

public static IWebHostBuilder CreateWebHostBuilder(string[] args) =>
    WebHost.CreateDefaultBuilder(args)
    // additional code
        .UseConfiguration(
            new ConfigurationBuilder()
            .AddXmlFile("file.xml", true) // second param is if file is optional
            .Build()
        )
    // end of additional code
        .UseStartup<Startup>();

Если вы хотите получить доступ к вашей среде, , если , ониустановить в качестве переменных среды, вы можете использовать одну из Environment.Get... функций.

Что касается вашего сервиса, я не уверен, каким образом вы пытаетесь получить доступ к вашему XML, но вы всегда можете ввести IConfiguration как простейшее решение, если вам нужно.Тем не менее, я бы посоветовал не раскрывать всю вашу конфигурацию вашим службам и взглянуть на настройку параметров с помощью этой документации

0 голосов
/ 03 декабря 2018
public void ConfigureServices(IServiceCollection services, IHostingEnvironment environment) {
        if (environment.IsDevelopment()) {
            // bla bla bla
        } else {
            // bla bla bla
        }
        // register no-matter-which-environment services
}
...