Pārskats:
Sāciet, pievienojot ASP.NET Core GitHub atvērtā koda adresi
Hipersaites pieteikšanās ir redzama.
Hipersaites pieteikšanās ir redzama.
Pēc jauna projekta izveides ASP.NET Core 3.1 programmas kods ir šāds:
Mēs dziļi iedziļinājāmies ievadkodā kopā ar GitHub avota kodu.
Saimnieka kods:Hipersaites pieteikšanās ir redzama.
Metode CreateDefaultBuilder
Šeit mēs instancējam HostBuilder objektu, kas manto no IHostBuilder, un pievienojam sistēmas definētus pārstāvjus, piemēram, :appsettings.json, appsettings. {env. EnvironmentName}.json konfigurācijas fails, kas galu galā atgriezīsies: IHostBuilder interfeiss.
HostBuilder kods:Hipersaites pieteikšanās ir redzama.
Galu galā tiks izsaukta būvēšanas metode.
publiskais IHost Build()
{ ja (_hostBuilt) { izmet jaunu InvalidOperationException(SR. BuildCalled); } _hostBuilt = patiess;
BuildHostConfiguration(); CreateHostingEnvironment(); CreateHostBuilderContext(); BuildAppConfiguration(); CreateServiceProvider();
atgriešanās _appServices.GetRequiredService<IHost>();
} BuildHostConfiguration metode
privāts IConfiguration _hostConfiguration; IConfigurationBuilder configBuilder = jauns ConfigurationBuilder() Zvaniet pārstāvim, lai pēc kārtas pievienotu konfigurāciju
CreateHostingEnvironment metode
privātā HostingEnvironment _hostingEnvironment; _hostingEnvironment = jauns HostingEnvironment()
{ ApplicationName = _hostConfiguration[HostDefaults.ApplicationKey], EnvironmentName = _hostConfiguration[HostDefaults.EnvironmentKey] ?? Vide.Ražošana, ContentRootPath = ResolveContentRootPath(_hostConfiguration[HostDefaults.ContentRootKey], AppContext.BaseDirectory), }; Metode CreateHostBuilderContext
privāts HostBuilderContext _hostBuilderContext; _hostBuilderContext = jauns HostBuilderContext(Properties)
{ HostingEnvironment = _hostingEnvironment, Konfigurācija = _hostConfiguration }; BuildAppConfiguration metode
Konfigurācijas informācijas integrēšana vēlreiz
IConfigurationBuilder configBuilder = jauns ConfigurationBuilder() . SetBasePath(_hostingEnvironment.ContentRootPath) . AddConfiguration(_hostConfiguration, shouldDisposeConfiguration: true); _appConfiguration = configBuilder.Build(); _hostBuilderContext.Konfigurācija = _appConfiguration; Metode CreateServiceProvider
var pakalpojumi = jauns ServiceCollection(); Reģistrējiet pakalpojumu, zvaniet pārstāvim un pievienojiet lietotāja definētu pakalpojumu.
GeneralicHostBuilderExtensions paplašinājuma metode
Hipersaites pieteikšanās ir redzama.
ConfigureWebHost paplašinājuma metode
Lai reģistrētu GenericWebHostService kā aizmugursistēmas pakalpojumu:
celtnieks. ConfigureServices((konteksts, pakalpojumi) => pakalpojumi. AddHostedService<GenericWebHostService>()); GenericWebHostService kods:Hipersaites pieteikšanās ir redzama.
public async Task StartAsync(CancellationToken cancellationToken) { HostingEventSource.Log.HostStart();
var serverAddressesFeature = Server.Features.Get<IServerAddressesFeature>(); var adreses = serverAddressesFeature?. Adreses; if (adreses != null && !adreses. IsReadOnly && adreses. Skaits == 0) { var urls = Konfigurācija[WebHostDefaults.ServerUrlsKey]; ja (!virkne. IsNullOrEmpty(urls)) { serverAddressesFeature!. PreferHostingUrls = WebHostUtilities.ParseBool(Konfigurācija, WebHostDefaults.PreferHostingUrlsKey);
foreach (var vērtība url. Split('; ', StringSplitOptions.RemoveEmptyEntries)) { adreses. Pievienot(vērtība); } } }
PieprasītDeleģēt? pieteikums = nulle;
izmēģināt { var konfigurēt = Options.ConfigureApplication;
if (konfigurēt == null) { Throw new InvalidOperationException($"Nav konfigurēta lietojumprogramma. Lūdzu, norādiet lietojumprogrammu, izmantojot IWebHostBuilder.UseStartup, IWebHostBuilder.Configure, vai norādot startēšanas montāžu, izmantojot {nameof(WebHostDefaults.StartupAssemblyKey)} tīmekļa resursdatora konfigurācija."); }
var builder = ApplicationBuilderFactory.CreateBuilder(Server.Features);
foreach (var filtrs StartupFilters.Reverse()) { konfigurēt = filtrēt. Konfigurēt(konfigurēt); }
konfigurēt(veidotājs);
Pieprasījumu konveijera izveide lietojumprogramma = celtnieks. Būvēt (); } nozveja (izņēmums, piemēram) { Logger.ApplicationError (ex);
ja (! Options.WebHostOptions.CaptureStartupErrors) { mest; }
var showDetailedErrors = HostingEnvironment.IsDevelopment() || Options.WebHostOptions.DetailedErrors;
lietojumprogramma = ErrorPageBuilder.BuildErrorPageApplication(HostingEnvironment.ContentRootFileProvider, Logger, showDetailedErrors, ex); }
var httpApplication = jauns HostingApplication(lietojumprogramma, Logger, DiagnosticListener, HttpContextFactory);
gaidīt Server.StartAsync(httpApplication, cancellationToken);
if (adreses != null) { foreach (var adrese adresēs) { LifetimeLogger.ListeningOnAddress(adrese); } }
if (Logger.IsEnabled(LogLevel.Debug)) { foreach (var montāža Options.WebHostOptions.GetFinalHostingStartupAssemblies()) { Logger.StartupAssemblyLoaded(montāža); } }
if (Options.HostingStartupExceptions != null) { foreach (var izņēmums Options.HostingStartupExceptions.InnerExceptions) { Logger.HostingStartupAssemblyError(izņēmums); } } }
var webhostBuilder = jauns GenericWebHostBuilder(veidotājs, webHostBuilderOptions); Hipersaites pieteikšanās ir redzama.
WebHostBuilderExtensions paplašinājuma metode
Nodrošina startupType objektu IWebHostBuilder zvaniem.
šis IWebHostBuilder hostBuilder if (hostBuilder ir ISupportsStartup supportsStartup)
{ atgriezties atbalstaStartup.UseStartup(startupType);
} Hipersaites pieteikšanās ir redzama.
GenericWebHostBuilder Private Method GenericWebHostBuilder
Dinamiski instancējiet mūsu startēšanas objektu:
piemērs ?? = ActivatorUtilities.CreateInstance(jauns HostServiceProvider(webHostBuilderContext), startupType); konteksts. Rekvizīti[_startupKey] = instance; Meklējiet metodi ConfigureServices
var configureServicesBuilder = StartupLoader.FindConfigureServicesDelegate(startupType, context. HostingEnvironment.EnvironmentName); var configureServices = configureServicesBuilder.Build(instance);
iekšējais statiskais ConfigureServicesBuilder FindConfigureServicesDelegate([DynamicallyAccessedMembers(StartupLinkerOptions.Accessibility)] Tips startupType, virkne environmentName) { var servicesMethod = FindMethod(startupType, "Configure{0}Services", environmentName, typeof(IServiceProvider), required: false) ?? FindMethod(startupType, "Configure{0}Services", environmentName, typeof(void), required: false); atgriezt jaunu ConfigureServicesBuilder(servicesMethod); Meklējiet metodi ConfigureContainer
var configureContainerBuilder = StartupLoader.FindConfigureContainerDelegate(startupType, context. HostingEnvironment.EnvironmentName);
iekšējais statiskais ConfigureContainerBuilder FindConfigureContainerDelegate([DynamicallyAccessedMembers(StartupLinkerOptions.Accessibility)] Tips startupType, string environmentName) { var configureMethod = FindMethod(startupType, "Configure{0}Container", environmentName, typeof(void), required: false); atgriezt jaunu ConfigureContainerBuilder(configureMethod); } Meklējiet konfigurēšanas metodi
configureBuilder = StartupLoader.FindConfigureDelegate(startupType, context. HostingEnvironment.EnvironmentName);
iekšējais statiskais ConfigureBuilder FindConfigureDelegate([DynamicallyAccessedMembers(StartupLinkerOptions.Accessibility)] Tips startupType, string environmentName)
{ var configureMethod = FindMethod(startupType, "Configure{0}", environmentName, typeof(void), required: true)!; atgriezt jaunu ConfigureBuilder(configureMethod);
} Avota kods, ko izsauc ConfigureBuilder veidošanas metode, ir šāds:
privātā klase ConfigureBuilder { publiskais ConfigureBuilder(MethodInfo konfigurēt) { MethodInfo = konfigurēt; }
public MethodInfo MethodInfo { get; }
publiskā darbības<IApplicationBuilder> veidošana(objekta instance) { return (applicationBuilder) => Invoke(instance, applicationBuilder); }
private void Invoke(objekta instance, IApplicationBuilder veidotājs) { var serviceProvider = veidotājs. Lietojumprogrammu pakalpojumi; var parameterInfos = MethodInfo.GetParameters(); var parametri = jauns objekts[parameterInfos.Length]; for (var indekss = 0; indekss < parametrsInfos.Length; indekss++) { var parameterInfo = parameterInfos[indekss]; if (parameterInfo.ParameterType == typeof(IApplicationBuilder)) { parametri[indekss] = veidotājs; } citādi { izmēģināt { parameters[index] = serviceProvider.GetRequiredService(parameterInfo.ParameterType); } nozveja (izņēmums, piemēram) { Izmest jaunu InvalidOperationException( Resources.FormatMiddlewareFilter_ServiceResolutionFail ( parametrsInfo.ParameterType.FullName, parameterInfo.Name, MethodInfo.Name, MethodInfo.DeclaringType.FullName), piem.); } } } MethodInfo.Invoke(instance, parametri); } } Palaist metodi
HostingAbstractionsHostExtensions paplašinājuma metodes adrese:
Hipersaites pieteikšanās ir redzama.
Galu galā zvana:
/// <summary> Palaiž lietojumprogrammu un atgriež uzdevumu, kas tiek pabeigts tikai tad, kad tiek aktivizēts marķieris vai aktivizēta izslēgšana. /// </summary> <param name="host">Palaist <see cref="IHost"/>.</param> <param name="token">marķieris, kas aktivizē izslēgšanu.</param> <returns><skatīt cref="Uzdevums"/>, kas apzīmē asinhrono darbību.</returns> publiskais statiskais asinhronais uzdevums RunAsync(šis IHost resursdators, CancellationToken marķieris = noklusējums) { izmēģināt { gaidīt saimnieku. StartAsync(marķieris). ConfigureAwait(nepatiess);
gaidīt saimnieku. WaitForShutdownAsync(marķieris). ConfigureAwait(nepatiess); } Noslēgumā { if (resursdators ir IAsyncDisposable asyncDisposable) { gaidiet asyncDisposable.DisposeAsync(). ConfigureAwait(nepatiess); } citādi { saimnieks. Iznīcināt (); }
} } Agrāk, veidojot pakalpojumu, es reģistrējos IHost pakalpojumam, un kods ir šāds:
pakalpojumi. AddSingleton<IHost>(_ => { atgriezt jaunu Internal.Host(_appServices, _appServices.GetRequiredService<IHostApplicationLifetime>(), _appServices.GetRequiredService<ILogger<Internal.Host>>(), _appServices.GetRequiredService<IHostLifetime>(), _appServices.GetRequiredService<IOptions<HostOptions>>()); }); StartAsync metode
Adrese:Hipersaites pieteikšanās ir redzama.
public async Task StartAsync(CancellationToken cancellationToken = noklusējums) { _logger. Sākums();
izmantojot var combinedCancellationTokenSource = CancellationTokenSource.CreateLinkedTokenSource(cancellationToken, _applicationLifetime.ApplicationStopping); CancellationToken combinedCancellationToken = combinedCancellationTokenSource.Token;
gaidīt _hostLifetime.WaitForStartAsync(combinedCancellationToken). ConfigureAwait(nepatiess);
combinedCancellationToken.ThrowIfCancellationRequested(); _hostedServices = Services.GetService<IEnumerable<IHostedService>>();
foreach (IHostedService hostedService _hostedServices) { Ugunsgrēks IHostedService.Start gaidīt hostedService.StartAsync(combinedCancellationToken). ConfigureAwait(nepatiess);
if (hostedService ir BackgroundService backgroundService) { _ = HandleBackgroundException(backgroundService); } }
Ugunsgrēks IHostApplicationLifetime.Started _applicationLifetime.PaziņotSākts();
_logger. Sākts(); } (Beigas)
|