2016-08-31 3 views
2

Я прочитал Working with multiple environments и о классе Startup.Как настроить класс запуска в Asp.Net Core

При запуске приложения ASP.NET ядра, класс запуска используется для начальной загрузки приложения, загружать свои настройки конфигурации и т.д. (узнать больше о запуске 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?

+0

Этот шаблон 'Startup {ENVIRONMENT} .cs' все еще работает? Они удалили его из своего репозитория github ... https://github.com/aspnet/Docs/commit/8c8771f2b765d5a665a2d3639d60888876e3fda4#diff-1b381ac5136edcd1392a3cce02697697 – Technetium

+0

Видимо, это так! Я не мог найти его нигде. Я прочитал исходный код, чтобы найти свой ответ. – Technetium

+0

Я бы создал частные методы 'ConfigureDevelopment',' ConfigureStaging' и 'ConfigureProduction' и использовал его условно в основном' Configure' методе. –

ответ

3

an IWebHostBuilder.UseStartup(string assemblyName) extension method что вы можете использовать для загрузки правильного класса Startup{ASPNETCORE_ENVIRONMENT}. Как только это определено, here is the algorithm, который пытается найти правильный класс.

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

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* классов должны быть в такой же сборка.

2

Я получил это работает только при пропускании сборки имя

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

    host.Run(); 
} 
-1

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

+0

Это не дает ответа на вопрос. Вы можете [искать похожие вопросы] (// stackoverflow.com/search) или ссылаться на связанные и связанные вопросы в правой части страницы, чтобы найти ответ. Если у вас есть связанный, но другой вопрос, задайте новый вопрос (// stackoverflow.com/questions/ask) и включите ссылку на эту ссылку, чтобы помочь обеспечить контекст. См.: [Задавайте вопросы, получайте ответы, не отвлекайте] (// stackoverflow.com/tour) –