Introducci贸n. De qu茅 se trata este art铆culo.
No hace mucho tiempo en Habr茅, vi un art铆culo con un t铆tulo prometedor "驴Qu茅 es la clase de inicio y Program.cs en ASP.NET Core?"... Siempre he estado interesado e interesado en lo que est谩 sucediendo exactamente bajo el cap贸 de una biblioteca o marco en particular con el que trabajo. Y esto se aplica completamente a las aplicaciones web en ASP.NET Core. Y esperaba obtener informaci贸n nueva de este art铆culo sobre c贸mo funcionan las clases mencionadas al iniciar una aplicaci贸n de este tipo. Ese art铆culo, lamentablemente, me decepcion贸: solo reiter贸 una parte del manual una vez m谩s, no recib铆 ninguna informaci贸n nueva de all铆. Y mientras lo le铆a, pens茅 que probablemente hay otras personas que, como yo, est谩n interesadas no solo en saber c贸mo usar este o aquel framework (ASP.NET Core en este caso), sino tambi茅n en c贸mo funciona. Y dado que, por varias razones, he profundizado recientemente en la estructura interna de ASP.NET Core, pens茅:que ahora tengo mucho que contar sobre 茅l m谩s all谩 del alcance de los manuales. Y es por eso que decid铆 comenzar escribiendo un art铆culo sobre qu茅 son realmente las clases de Startup y Program, para no contar tanto sobre c贸mo usarlas (esto est谩 en numerosos manuales, que, seg煤n me parece, hay no tiene sentido duplicar), pero principalmente sobre c贸mo funcionan estas clases y, en el contexto de toda la aplicaci贸n web en ASP.NET Core. Sin embargo, dado que no se puede comprender la inmensidad, el tema de este art铆culo es limitado. En primer lugar, se limita a una historia solo sobre aplicaciones web creadas con un nuevo tipo de plantilla de aplicaci贸n: Generic Host. En segundo lugar, el art铆culo se dedicar谩 煤nicamente a c贸mo se realiza la inicializaci贸n de la aplicaci贸n web,porque el papel principal de las clases en cuesti贸n es exactamente eso: inicializaci贸n y lanzamiento de la aplicaci贸n alojada. Entonces, para qui茅n el tema en consideraci贸n, incluso en un volumen tan limitado, es interesante: bienvenido bajo cat.
.
- , . , - ( ):
TL;DR
( : - ).
, Generic Host .
(Host), IHostBuilder
, - IHostBuilder , - , . , , IHostBuilder.
IHostBuilder -. , ( IHostBuilder). Generic Host ( - , Host).
(), IHost, Build IHostBuilder .
. : , , , , (options). IHost Build.
, . : ; ; ; - .
, StartAsync IHost. - IHostedService - StartAsync. , .
.
, , , . , :
:
ASP.NET Core - - , . , , , - . , - , , , . , , " ", . , , : ASP.NET. : - , , , , ( , ). : , -, Generic Host, .. - - : , , , , .
:
, : , , - ... - - - : , .. " ". ( ) ( ) .
. ASP.NET Core . , . , Visual Studio , ASP.NET Core ", , " . ASP.NET Core .
:
, : , ASP.NET Core ( ) , , /, , , (" "), , ( - -) ( - , , - -), - , - , , var, ( - ) , / / - , C#. , , , - , ;-). (-) .
, ASP.NET, - ;-) , GOTO DO 5 . , -, , , , , , , ;-) (, , , - , ). .
ASP.NET Core, , Generic Host, - (, , - . ), , - .
:
, , - , - " ". D "SOLID". : " ", " ". - . , , , : , , , , , , - : . , , - , , . , . .
( ) . , , .
.
:
, , . : , , - // - - IMHO . IDE, , , : , , , , , . , , ( , - ).
, ASP.NET, .
, , ASP.NET - , , , , " ": , , , , . .
, ASP.NET, Generic Host , -: Web Host. (Microsoft) ASP.NET Core ( 3.1.8) , . , , , , . Generic Host. , -, (Middleware), , : .
, , (, IHost), .NET Core, ( - , DI Container), (Configuration), (Options).
, - . , , . , - , , " " ( ) . , , , ( ), , -, , ( ), , -, , , - , - , , - . , , Middleware, ( ASP.NET) , .
...
, - . , , , ASP.NET program.cs Program, Main. , Visual Studio, , . , CreateHostBuilder: CreateDefaultBuilder Microsoft.Extension.Hosting.Host , IHostBuilder ( ), IHostBuilder IHostBuilder ( ), , , . CreateHostBuilder , , ORM Entity Framework Core (DbContext), ( ). , Main, IHostBuilder.Build , IHost. , , IHost : Run, , , . - .
: ?
- . , , , ASP.NET Core "" (Builder pattern). , IMHO , , ( , ). - , Builder pattern Dependency Injection ( ), ASP.NET Core - . .
. , - (// ), , . , - , ( - -) - .
-: ConfigureWebHostDefaults -, Startup ( , -, , , , Startup-).
.. - Startup-, , , Startup- - : -, , Startup-. , Startup- - .
: -.
ConfigureWebHost, , -, . , IDE() ( ) : , ( ) IWebHostBuilder. - . , , , , - .
, - - , - , -.
. , - -
,
( - .NET Framework 3.5) (Expression Trees) - , . -, , , , . "" ;-) .
, , - . , ASP.NET Core " ", " ".
:
: , . , : , - ( Startup-, ). , , : ( StackOverflow ..), , , . . " ": , -, , , , . , , , - , , - ! (, , , ): , , , - (), . (, ) : " ( ) ". , , . : , , , , , . , , , , .
:
, , , , Generic Host, , .
:
-c - , , - , . , . , , . - , . . - : , . . - , . - / ( , , ). - .
Host.CreateHostBuilder , IHostBuilder. () AddFeature1..AddFeatureN. IHostBuilder , Build. Build , . IHost ( - , Host) StartAsync .
IHostBuilder, CreateDefaultBuilder (, Microsoft.Extensions.Hosting.Host), Microsoft.Extensions.Hosting.HostBuilder( , - IHostBuilder). CreateDefaultBuilder , ( . ). - - , new, , , " ".
, ..
, , . , , , , . : ". ". - . , - , - , , .
Build. , , IHost ( "") .
-
Host, . Microsoft "" , - "node" "", . - Host "", " ". - - "" - , , -. .
, - "" - - ( ) , , . List<>, ,
:
( ) - , , (, , ).
, : , , , . .1 (""), : . , IHostBuilder . .1 , . - , .
: IHostBuilder
IHostBuilder, . IHostBuilder, UseServiceProviderFactory ( ) -, - , IServiceProvider. . , , IHostBuilder ( , , ) - Properties( IDictionary<object,object>), , ( - , ). , , IHostBuilder . (, ): HostBuilderContext, - ( ), (Singleton) .
- IHostBuilder. IHostBuilder . - , - .
Generic Host
, , , Generic Host
ASP.NET Core ( .NET Core ) - , IConfiguration .NET Core -, -, .
: ,
( , IConfigurationProvider) .NET Core : (environment), , ... , IConfigurationProvider. - : (, ) . , (, ), , . - .. : - , . , , , , , IConfiguration. ( - ) : , : (Bind) .
. : - IConfigurationBuilder - IConfigurationSource. - Build - IConfiguration. - , .
, , , ASP.NET Core .NET Core - : IServiceProvider. , , , . , - , , , . ( ) GetService -, - .
IServiceCollection, - . , ( ), . , .
:
ServiceDescriptor. , .
- , . - . - , , , . - IEnumerable -, , - IEnumerable IEnumerable, , . , IServiceCollection
. , (Singleton) ( ), - , , (Transient), (Scoped), () , , ServiceProvider IServiceScope CreateScope IServiceProvider. , , , .
:
) : , , ;
) -: , IServiceProvider; ( ); - ;
) ( ): .
ASP.NET Core .NET Core ( - ) - (Options). , , , , () , , . , -, , , .NET, : , , , , , . ( , - IOptions<>, IOptionsSnapshot<>, IOptionsMonitor<>, ). -, , , - (options). -, , . . , (options), , . IServiceCollection, . , , IConfiguration ( - ), , -, . , .
, - ( ), IHost , Build IHostBuilder. Generic Host Microsoft.Extensions.Hosting.HostBuilder ( HostBuilder) Build .
Build. Build .
: Build
HostBuilder.Build , . HostBuilder _hostBuilt, false. , true, - InvalidOperationException. _hostBuilt true.
, , . , - , - - , - , , , , . , (Host Configuration, - ). - , ( ), , , . - . . , , ConfigureHostConfiguration IHostBuilder _configureHostConfigActions. .1 "" 1.
:
ConfigureHostConfiguration -, - IConfigurationBuilder.
BuildHostConfiguration().
:
- ConfigurationBuider( IConfigurationBuilder) - configBuilder( .1 ) - , ( ) - ( IConfiguration) , . , IConfigurationBuilder ( , , ). , , ( IConfigurationBuilder.Build()) ( - ).
_hostConfiguration .
- , , . - (), IHostEnvironment. CreateHostingEnvironment(). HostingEnvironment, IHostEnvironment IHostingEnvironment ( IHostEnvironment). ( - . ). (ApplicationName), (Environment) (ContentRootPath).
- (-, . ). , , ContentRootFileProvider PhysicalFileProvider ContentRootPath - , ( ) . _hostingEnvironment .
, - ( HostBuilderContext) CreateHostBuilderContext. , : Properties - - ( . " : IHostBuilder"), Environment - (IHostEnvironment), Configuration - () ( ). _hostBuilderContext. , , .
BuildAppConfiguration. , , ConfigureAppConfiguration IHostBuilder _configureAppConfigActions. .1 "" 2.
:
ConfigureAppConfiguration -, - HostBuilderContext IHostBuilder. - ConfigurationBuider( IConfigurationBuilder) IHostEnvironment.ContentRootPath . IConfigurationBuilder SetBasePath. "FileProvider" PhysicalPathProvider . IFileProvider - (- FileConfigurationSource) , , - - , - .
IConfigurationBuilder . .
:
ChainedConfigurationSource, , ChainedConfigurationSource , ( Dispose) ChainedConfigurationProvider, .
.
:
IConfigurationBuilder _configureAppConfigActions, . - . . IConfigurationBuilder.Build.
( IConfiguration) _appConfiguration .
, IHostBuilder.Build - . CreateServiceProvider. , , .
- , . IServiceProviderFactory. , , , -, , , . - , , , .. , : ( . ) , IServiceCollection . - - ContainerBuilder( -, T), Container. "-". , - : .NET Core , , , , . ASP.NET Core .
, , IServiceProviderFactory. , CreateBuilder, IServiceCollection services) -, ( ) . CreateServiceProvider - - ( IServiceProvider).
(IHost) IHostBuilder UseServiceProviderFactory ( - -), : , - , HostBuilderContext , , . , , ( .1 ).
:
, , _serviceProviderFactory, - IConfigureContainerAdapter. - , HostBuilder, , -, - - . IConfigureContainerAdapter IServiceProviderFactory, . - , CreateBuilder - HostBuilderContext: , , UseServiceProviderFactory. - , IConfigureContainerAdapter - Object. , , ConfigureContainerAdapter, ( ) - - UseServiceProviderFactory, , , CreateServiceProvider . -, UseServiceProviderFactory , - (. ) (- ).
DefaultServiceProviderFactory. - IServiceCollection, .. IServiceProviderFactory. - - ( - , ).
:
ServiceProviderOptions - (options) . -: ValidateScopes - , (Scoped) ( ) ValidateOnBuild - , . ServiceProviderOptions.Default, . , , .
CreateBuilder DefaultServiceProviderFactory, , . CreateServiceProvider BuildServiceProvider IServiceCollection.
: CreateServiceProvider
, BuildServiceProvider, IServiceCollection, CreateServiceProvider - "-". ServiceProviderOptions - .
IServiceProvider. , , .
CreateServiceProvider , . IServiceCollection - services( .1 ). () , .
:
, - ServiceCollection. : List ( ), IServiceCollection . - ( (Singleton) ). - - , , Build: IHostEnvironment IHostingEnvironment ( - HostingEnvironment _hostingEnvironment) HostBuilderContext ( , ) ( - _hostBuilderContext. -, , , . - , , , ( ): IHostLifetime ( - ConsoleLifetime), IHostApplicationLifetime ( - ApplicationLifetime) IApplicationLifetime ( , IHostApplicationLifetime - ApplicationLifetime - , IApplicationLifetime) IConfiguration - -, - _appConfiguration ( -). - Dispose . - (. CreateServiceProvider ). , IServiceCollection , (options) - AddOptions, (logging) - AddLogging
( (Singleton) , Generic Host - IHost: Internal.Host, .
- - IServiceCollection _configureServicesActions. .1 "" 3. ConfigureServices. , : HostBuilderContext IServiceCollection.
- - containerBuilder ( .1 ).
: -
CreateBuilder IConfigureContainerAdapter, _serviceProviderFactory - containerBuilder
- - , , IServiceCollection.
- - - - - _configureContainerActions. .1 "" 4. ConfigureContainer. "" ( ) ASP.NET Core , , . , , , Startup- , , , ( UseStartup IWebHostBuilder).
( - )
ConfigureContainer - , -, -. - -, : - HostBuilderContext -, - -, - - ConfigureContainer. , - , ( List<>, ), IConfigureContainerAdapter, ConfigureContainerAdapter, -, ( - ). . ConfigureContainer , - Object. ConfigureContainerAdapter - . : : , - , - -. . , ConfigureContainer ConfigureContainerAdapter - , , , , Build . , , Object - - . IMHO - .
, - .
: -
- : (Scoped) , , Singleton - , , , , (Scoped). - , ( Development) - , InvalidOperationException. ValidateScopes ServiceProviderOptions, DefaultServiceProviderFactory, BuildServiceProvider IServiceCollection, . CreateBuilder IConfigureContainerAdapter, _serviceProviderFactory, - containerBuilder
CreateServiceProvider .
:
- : IConfiguration - , _appConfiguration ( Dispose()) ( - )
, Build HostBuilder - IHost ( Internal.Host), .
:
, IHost Build . Internal.Host, , -, , , , , , . , , , . - : - Build, . Internal.Host, HostBuilder.Build - , (option) HostOptions: , . , - - - Timespan. IHost HostBuilder.Build , .
, IHost - , . , IHost.StartAsync - , , StartAsync. StartAsync IHost - Internal.Host - ( ) IHostedService.StartAsync: IHostedService. . , - . , StartAsync IHost , .
Y ah铆 es donde la historia sobre la inicializaci贸n de una aplicaci贸n construida de acuerdo con la plantilla Generic Host puede considerarse completa: ahora la aplicaci贸n est谩 iniciada y en ejecuci贸n. 驴No es realmente muy simple? T贸mese su tiempo, en la continuaci贸n de este art铆culo habr谩 una historia sobre las caracter铆sticas de inicializar una aplicaci贸n web, y la sensaci贸n de simplicidad, si la hay, seguramente se desvanecer谩.
Continuaci贸n: se publicar谩 pr贸ximamente. Ya ha sido escrito (e incluso publicado en mi blog, pero de forma incompleta).