Как получить среду разработки /размещения /производства в ConfigureServices

Как получить среду хостинга для разработки /подготовки /производства в методе ConfigureServices при запуске?

public void ConfigureServices(IServiceCollection services)
{
    // Which environment are we running under?
}

Метод ConfigureServices принимает только один IServiceCollection параметр.

84 голоса | спросил Muhammad Rehan Saeed 13 thEurope/Moscowp30Europe/Moscow09bEurope/MoscowSun, 13 Sep 2015 13:56:09 +0300 2015, 13:56:09

8 ответов


0

вы можете легко получить к нему доступ в ConfigureServices, просто сохранить его в свойстве во время запуска метода, который вызывается первым и получает его, затем вы можете получить доступ к свойству из 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...
}
ответил Joe Audette 14 thEurope/Moscowp30Europe/Moscow09bEurope/MoscowMon, 14 Sep 2015 04:49:52 +0300 2015, 04:49:52
0

TL; DR

Установите переменную среды с именем ASPNETCORE_ENVIRONMENT с именем среды (например, Production). Затем сделайте одно из двух:

  • Вставьте IHostingEnvironment в Startup.cs, затем используйте это (env здесь), чтобы проверить: env.IsEnvironment("Production")
  • Используйте либо отдельные Startup, либо отдельные Configure /ConfigureServices функции. Если класс или функции соответствуют этим форматам, они будут использоваться вместо стандартных параметров в этой среде.
    • Startup{EnvironmentName}() (весь класс) || пример: StartupProduction()
    • Configure{EnvironmentName}() || пример: ConfigureProduction()
    • Configure{EnvironmentName}Services() || пример: ConfigureProductionServices()

Полное объяснение

Документы .NET Core описывают, как этого добиться . Используйте переменную среды с именем ASPNETCORE_ENVIRONMENT, которая установлена ​​в нужной среде, тогда у вас есть два варианта.

Проверить имя среды

Из документов :

  

Сервис IHostingEnvironment обеспечивает базовую абстракцию для работы со средами. Этот сервис предоставляется хостингом ASP.NET и может быть внедрен в логику запуска через Dependency Injection. Шаблон веб-сайта ASP.NET Core в Visual Studio использует этот подход для загрузки специфичных для среды файлов конфигурации (если они есть) и для настройки параметров обработки ошибок приложения. В обоих случаях такое поведение достигается путем обращения к указанной в данный момент среде путем вызова 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() в той же среде.

ответил vaindil 5 PM000000100000003431 2016, 22:27:34
0

В .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());
            }            
        });

        ......
    }
}
ответил David Liang 3 +03002017-10-03T21:59:38+03:00312017bEurope/MoscowTue, 03 Oct 2017 21:59:38 +0300 2017, 21:59:38
0

Это может быть выполнено без каких-либо дополнительных свойств или параметров метода, например так:

public void ConfigureServices(IServiceCollection services)
{
    IServiceProvider serviceProvider = services.BuildServiceProvider();
    IHostingEnvironment env = serviceProvider.GetService<IHostingEnvironment>();

    if (env.IsProduction()) DoSomethingDifferentHere();
}
ответил edicius6 28 FebruaryEurope/MoscowbWed, 28 Feb 2018 19:19:19 +0300000000pmWed, 28 Feb 2018 19:19:19 +030018 2018, 19:19:19
0

Среда размещения происходит из переменной среды ASPNET_ENV, которая доступна во время запуска с использованием метода расширения IHostingEnvironment.IsEnvironment или одного из соответствующих вспомогательных методов IsDevelopment или IsProduction. Сохраните то, что вам нужно, в Startup () или в вызове ConfigureServices:

var foo = Environment.GetEnvironmentVariable("ASPNET_ENV");
ответил Jeff Dunlop 13 thEurope/Moscowp30Europe/Moscow09bEurope/MoscowSun, 13 Sep 2015 15:24:39 +0300 2015, 15:24:39
0

согласно документации

  

ConfigureServices поддерживает определенные для среды версии   в форме Настроить {EnvironmentName} и Настроить {EnvironmentName} службы:

Вы можете сделать что-то вроде этого ...

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
}
ответил Shoe 21 MarpmWed, 21 Mar 2018 23:45:23 +03002018-03-21T23:45:23+03:0011 2018, 23:45:23
0

В Dotnet Core 2.0 конструктор автозагрузки ожидает только IConfiguration-параметр.

    public Startup(IConfiguration configuration)
    {
        Configuration = configuration;
    }

Как читать там хостинг? Я сохраняю его в Program-классе во время ConfigureAppConfiguration (используйте полный BuildWebHost вместо WebHost.CreateDefaultBuilder):

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();
}
ответил toralux 26 thEurope/Moscowp30Europe/Moscow09bEurope/MoscowTue, 26 Sep 2017 18:30:16 +0300 2017, 18:30:16
0

Я хотел получить среду в одном из моих сервисов. Это действительно легко сделать! Я просто вставляю это в конструктор следующим образом:

    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.
}
ответил Jess 10 MonEurope/Moscow2018-12-10T23:42:43+03:00Europe/Moscow12bEurope/MoscowMon, 10 Dec 2018 23:42:43 +0300 2018, 23:42:43

Похожие вопросы

Популярные теги

security × 330linux × 316macos × 2827 × 268performance × 244command-line × 241sql-server × 235joomla-3.x × 222java × 189c++ × 186windows × 180cisco × 168bash × 158c# × 142gmail × 139arduino-uno × 139javascript × 134ssh × 133seo × 132mysql × 132