2016-08-19 4 views
9

Чтение по documentation for ASP.NET Core, есть два метода, выделенных для Startup: Configure and ConfigureServices.Код запуска приложения в ASP.NET Core

Ни один из них не казался хорошим местом для размещения пользовательского кода, который я бы хотел запустить при запуске. Возможно, я хочу добавить настраиваемое поле в свою БД, если оно не существует, проверить конкретный файл, засеять некоторые данные в моей базе данных и т. Д. Код, который я хочу запустить один раз, только при запуске приложения.

Есть ли предпочтительный/рекомендуемый подход для этого?

+0

Добавление этот комментарий, как я чувствовал, что помощь в сохранении Startup.cs файл чистым для принятой Решение: http://odetocode.com/blogs/scott/archive/2016/08/30/keeping-a-clean-startup-cs-in-asp-net-core.aspx –

+0

Я знаю, что это было задано в 2016 году, но эта же проблема все еще применяется в 2018 году, вы должны рассмотреть пункты, которые я поставил, и пересмотреть принятый ответ. –

ответ

7

В большинстве случаев для такого пользовательского кода есть две точки входа во время запуска.

1.) Main метод

В приложении ASP.NET ядра имеет хороший старый Main метод как точки входа вы можете поместить код до запуска материала ASP.NET ядра, как

public class Program 
{ 
    public static void Main(string[] args) 
    { 
     // call custom startup logic here 
     AppInitializer.Startup(); 

     var host = new WebHostBuilder() 
      .UseKestrel() 
      .UseContentRoot(Directory.GetCurrentDirectory()) 
      .UseIISIntegration() 
      .UseStartup<Startup>() 
      .Build(); 

     host.Run(); 
    } 
} 

2.) Используйте свой Startup класс

Как уже говорилось в вашем вопросе является Configure и ConfigureServices хорошее место для вашего пользовательского кода.

Я бы предпочел класс Startup. С точки зрения времени выполнения это не имеет значения, если вызов вызывается при запуске или где-то еще до вызова host.Run(). Но с точки зрения программиста, привыкшего к структуре ASP.NET, его первым поиском такой логики будет файл Startup.cs. Все образцы и шаблоны помещают туда логику для инициализации Identity, Entity Framework и т. Д. Поэтому, как правило, я рекомендую разместить там элементы инициализации.

+0

Класс «Startup» также предлагает преимущество встроенного контейнера для инъекций 'IServiceProvider', доступного в' ConfigureServices' через свойство 'IApplicationBuilder.ApplicationServices'. – Brad

+0

OP сказал: «Ни одно из них не показалось хорошим местом для размещения пользовательского кода», а не то, что они являются хорошим местом. –

0

Я согласен с OP.

Мой сценарий заключается в том, что я хочу зарегистрировать микросервис с реестром службы, но не знаю, что такое конечная точка, пока не запущена микросервис.

Я чувствую, что методы Configure и ConfigureServices не идеальны, потому что ни один из них не был предназначен для выполнения такого вида обработки.

Другим сценарием было бы желание разогреть тайники, что опять-таки может нам помочь.

Есть несколько альтернатив принято отвечать:

  • Создать другое приложение, которое выполняет обновления за пределами вашего веб-сайта, такие как инструмент развертывания, который применяет обновления базы данных программно перед запуском веб-сайта

  • в классе запуска, используйте статический конструктор для обеспечения веб-сайт готов к запуску

Update

Самое лучшее, что нужно сделать, на мой взгляд, чтобы использовать интерфейс IApplicationLifetime как так:

public class Startup 
{ 
    public void Configure(IApplicationLifetime lifetime) 
    { 
     lifetime.ApplicationStarted.Register(OnApplicationStarted); 
    } 

    public void OnApplicationStarted() 
    { 
     // Carry out your initialisation. 
    } 
}