Как настроить класс Startup в Asp.Net Core

Я прочитал Работа с несколькими средами и о Startup.

Когда приложение ASP.NET Core запускается, класс Startup используется для начальной загрузки приложения, загрузки его параметров конфигурации и т. д. (узнайте больше о запуске ASP.NET). Однако если существует класс с именем Startup{EnvironmentName} (например, StartupDevelopment) и переменная среды ASPNETCORE_ENVIRONMENT соответствует этому имени, то вместо него используется этот класс Startup. Таким образом, вы можете настроить Startup для разработки, но иметь отдельный StartupProduction, который будет использоваться при запуске приложения в рабочей среде. Или наоборот.

Итак, у меня есть 3 класса запуска StartupDevelopment, StartupStaging и StartupProduction, и мой Program.cs настроен, как показано ниже.

public class Program
{
    public static void Main(string[] args)
    {
        var host = new WebHostBuilder()
            .UseKestrel()
            .UseContentRoot(Directory.GetCurrentDirectory())
            .UseIISIntegration()
            .UseStartup<StartupDevelopment>()
            .Build();

        host.Run();
    }
}

Обратите внимание, что .UseStartup<StartupDevelopment>() настроен для StartupDevelopment.

Теперь в Staging и Production я бы поставил ASPNETCORE_ENVIRONMENT соответственно. Однако как ядро ​​​​Asp.Net узнает, что нужно использовать StartupStaging или StartupProduction, поскольку оно жестко запрограммировано на StartupDevelopment?


person LP13    schedule 31.08.2016    source источник
comment
Этот шаблон Startup{ENVIRONMENT}.cs все еще работает? Они удалили его из своего репозитория на github... зафиксировать/   -  person Technetium    schedule 31.08.2016
comment
Видимо так и есть! Я нигде не мог найти его пример. Я прочитал исходный код, чтобы найти ответ.   -  person Technetium    schedule 31.08.2016
comment
Я бы создал частные методы ConfigureDevelopment, ConfigureStaging и ConfigureProduction и использовал их условно в основном методе Configure.   -  person adem caglin    schedule 31.08.2016


Ответы (3)


Существует метод расширения IWebHostBuilder.UseStartup(string assemblyName)< /a>, который вы можете использовать для загрузки правильного класса Startup{ASPNETCORE_ENVIRONMENT}. Как только это будет определено, вот алгоритм, который пытается найти правильный класс.

Если вы не хотите жестко кодировать имя сборки, вы можете получить его программно следующим образом:

using System.Reflection; // Add this so you can use .GetTypeInfo()

public class Program 
{
    public static void Main(string[] args)
    {
        var host = new WebHostBuilder()
            .UseKestrel()
            .UseContentRoot(Directory.GetCurrentDirectory())
            .UseIISIntegration()
            .UseStartup(typeof(StartupDevelopment).GetTypeInfo().Assembly.GetName().Name)
            .Build();

        host.Run();
    }
}

Чтобы вы могли использовать это соглашение, все ваши Startup* классы должны находиться в одной сборке.

person Technetium    schedule 31.08.2016

Я заработал, просто передав имя сборки

public static void Main(string[] args)
{
    var host = new WebHostBuilder()
        .UseKestrel()
        .UseContentRoot(Directory.GetCurrentDirectory())
        .UseIISIntegration()
        .UseStartup("MyAssemblyName")
        .Build();

    host.Run();
}
person LP13    schedule 31.08.2016

Предполагая, что у вас есть Startup в отдельной сборке, чем Main, вы статически ссылались на сборку в своем основном проекте?

person Satyam Guha Roy    schedule 10.08.2017
comment
Это не дает ответа на вопрос. Вы можете выполнить поиск похожих вопросов или обратиться к связанным и связанным вопросам в правой части страницы, чтобы найти ответ. Если у вас есть похожий, но другой вопрос, задайте новый вопрос и добавьте ссылку на этот вопрос, чтобы обеспечить контекст. См.: Задавайте вопросы, получайте ответы, не отвлекайтесь - person Kuba hasn't forgotten Monica; 10.08.2017