Denne artikel er en spejling af maskinoversættelse, klik venligst her for at springe til den oprindelige artikel.

Udsigt: 59583|Svar: 1

[Kilde] ASP.NET Core (7) Dybdegående analyse af frameworkets kildekode

[Kopier link]
Opslået den 24-3-2021 13:43:28 | | |
Anmeldelse:

ASP.NET Core (VI) DI henter manuelt metoden til at injicere objekter
https://www.itsvse.com/thread-9595-1-1.html

ASP.NET Core (fem) er baseret på CAP-distribuerede transaktioner
https://www.itsvse.com/thread-9593-1-1.html

ASP.NET Core(4)-filter, samlet ModelState-modelvalidering
https://www.itsvse.com/thread-9589-1-1.html

ASP.NET Core (iii) Opret dynamisk instanser ved hjælp af ActivatorUtilities
https://www.itsvse.com/thread-9488-1-1.html

ASP.NET Core (2) Genstart applikationen ved at kode
https://www.itsvse.com/thread-9480-1-1.html

ASP.NET Core (1) bruger Redis-caching
https://www.itsvse.com/thread-9393-1-1.html
Start med at vedhæfte den ASP.NET Core GitHub open source-adresse

Hyperlink-login er synlig.
Hyperlink-login er synlig.


asp.net Kernekildekodeadresse
https://www.itsvse.com/thread-9394-1-1.html


Efter at have oprettet et nyt projekt ASP.NET Core 3.1, er programkoden som følger:

Vi dykkede dybt ned i adgangskoden kombineret med GitHub-kildekoden.

Værtskode:Hyperlink-login er synlig.

CreateDefaultBuilder-metoden

Her instansierer vi et HostBuilder-objekt, som arver fra IHostBuilder, og tilføjer systemdefinerede delegerede, såsom :appsettings.json, appsettings. {env. EnvironmentName}.json konfigurationsfil, som til sidst vil returnere: IHostBuilder-interfacet.

HostBuilder-kode:Hyperlink-login er synlig.

Build-metoden vil til sidst blive kaldt.


offentlig IHost Build()
{
    hvis (_hostBuilt)
    {
        smid ny InvalidOperationException(SR. BuildCalled);
    }
    _hostBuilt = sand;

    BuildHostConfiguration();
    CreateHostingEnvironment();
    CreateHostBuilderContext();
    BuildAppConfiguration();
    CreateServiceProvider();

    returner _appServices.GetRequiredService<IHost>();
}
BuildHostConfiguration-metoden

privat IConfiguration _hostConfiguration;
IConfigurationBuilder configBuilder = ny ConfigurationBuilder()
Ring til delegaten for at tilføje konfiguration igen

CreateHostingEnvironment-metoden

privat HostingEnvironment _hostingEnvironment;
_hostingEnvironment = nyt HostingEnvironment()
{
    ApplicationName = _hostConfiguration[HostDefaults.ApplicationKey],
    EnvironmentName = _hostConfiguration[HostDefaults.EnvironmentKey] ?? Miljøer.Produktion,
    ContentRootPath = ResolveContentRootPath(_hostConfiguration[HostDefaults.ContentRootKey], AppContext.BaseDirectory),
};
CreateHostBuilderContext-metoden

privat HostBuilderContext _hostBuilderContext;
_hostBuilderContext = ny HostBuilderContext(Properties)
{
    HostingEnvironment = _hostingEnvironment,
    Konfiguration = _hostConfiguration
};
BuildAppConfiguration-metoden

Integrer konfigurationsinformationen igen

IConfigurationBuilder configBuilder = ny ConfigurationBuilder()
                . SetBasePath(_hostingEnvironment.ContentRootPath)
                . AddConfiguration(_hostConfiguration, shouldDisposeConfiguration: true);
_appConfiguration = configBuilder.Build();
            _hostBuilderContext.Configuration = _appConfiguration;
CreateServiceProvider-metoden

var services = ny ServiceCollection();
Registrer en tjeneste, kald en delegeret, og tilføj en brugerdefineret tjeneste.

GenericHostBuilderExtensions udvidelsesmetoden

Hyperlink-login er synlig.

ConfigureWebHost-udvidelsesmetoden

For at registrere GenericWebHostService som en backend-tjeneste:


Bygger. ConfigureServices((context, services) => services. AddHostedService<GenericWebHostService>());
GenericWebHostService-kode:Hyperlink-login er synlig.


offentlig asynkron opgavestartAsynk (CancellationToken annulleringstoken)
        {
            HostingEventSource.Log.HostStart();

            var serverAddressesFeature = Server.Features.Get<IServerAddressesFeature>();
            var addresses = serverAddressesFeature?. Adresser;
            hvis (adresser != null && !adresser. IsReadOnly && adresser. Antal == 0)
            {
                var urls = Configuration[WebHostDefaults.ServerUrlsKey];
                hvis (!string. IsNullOrEmpty(urls))
                {
                    serverAddressesFeature!. PreferHostingUrls = WebHostUtilities.ParseBool(Configuration, WebHostDefaults.PreferHostingUrlsKey);

                    foreach (var-værdi i URL'er. Split('; ', StringSplitOptions.RemoveEmptyEntries))
                    {
                        adresser. Add(værdi);
                    }
                }
            }

            RequestDelegate? anvendelse = null;

            Prøv
            {
                var configure = Options.ConfigureApplication;

                hvis (konfigurere == null)
                {
                    smid ny InvalidOperationException($"Ingen applikation konfigureret. Angiv venligst en applikation via IWebHostBuilder.UseStartup, IWebHostBuilder.Configure, eller angiv startup-assemblyen via {nameof(WebHostDefaults.StartupAssemblyKey)} i webhostkonfiguration.");
                }

                var builder = ApplicationBuilderFactory.CreateBuilder(Server.Features);

                foreach (var-filter i StartupFilters.Reverse())
                {
                    konfigurere = filter. Konfigurér (konfigurér);
                }

                konfigurér (bygger);

                Byg anmodningspipelinen
                Anvendelse = Bygger. Build();
            }
            catch (Undtagelse f.eks.)
            {
                Logger.ApplicationError(f.eks.);

                hvis (! Options.WebHostOptions.CaptureStartupErrors)
                {
                    kast;
                }

                var showDetailedErrors = HostingEnvironment.IsDevelopment() || Options.WebHostOptions.DetailedErrors;

                application = ErrorPageBuilder.BuildErrorPageApplication(HostingEnvironment.ContentRootFileProvider, Logger, showDetailedErrors, f.eks.);
            }

            var httpApplication = new HostingApplication(application, Logger, DiagnosticListener, HttpContextFactory);

            await Server.StartAsync(httpApplication, cancellationToken);

            hvis (adresser != null)
            {
                foreach (VAR-adresse i adresser)
                {
                    LifetimeLogger.ListeningOnAddress(adresse);
                }
            }

            hvis (Logger.IsEnabled(LogLevel.Debug))
            {
                foreach (var assembly i Options.WebHostOptions.GetFinalHostingStartupAssemblies())
                {
                    Logger.StartupAssemblyLoaded(assembly);
                }
            }

            hvis (Options.HostingStartupExceptions != null)
            {
                foreach (var-undtagelse i Options.HostingStartupExceptions.InnerExceptions)
                {
                    Logger.HostingStartupAssemblyError(undtagelse);
                }
            }
        }


var webhostBuilder = ny GenericWebHostBuilder(builder, webHostBuilderOptions);
Hyperlink-login er synlig.

WebHostBuilderExtensions udvidelsesmetoden

Leverer et startupType-objekt til IWebHostBuilder-kald.

denne IWebHostBuilder hostBuilder
if (hostBuilder er ISupportsStartup supportsStartup)
{
    return supportsStartup.UseStartup(startupType);
}
Hyperlink-login er synlig.

GenericWebHostBuilder Privat metode GenericWebHostBuilder

Instansier vores Startup-objekt dynamisk:

instans ?? = ActivatorUtilities.CreateInstance(ny HostServiceProvider(webHostBuilderContext), startupType);
kontekst. Egenskaber[_startupKey] = instans;
Søg efter ConfigureServices-metoden

var configureServicesBuilder = StartupLoader.FindConfigureServicesDelegate(startupType, context. HostingEnvironment.EnvironmentName);
                var configureServices = configureServicesBuilder.Build(instance);

intern statisk ConfigureServicesBuilder Find ConfigureServicesDelegate([DynamicallyAccessedMembers(StartupLinkerOptions.Accessibility)] Skriv startupType, streng miljøNavn)
        {
            var servicesMethod = FindMethod(startupType, "Configure{0}Services", environmentName, typeof(IServiceProvider), krævet: false)
                ?? FindMethod(startupType, "Configure{0}Services", environmentName, typeof(void), krævet: false);
            returner ny ConfigureServicesBuilder(servicesMethod);
Søg efter ConfigureContainer-metoden

var configureContainerBuilder = StartupLoader.FindConfigureContainerDelegate(startupType, context. HostingEnvironment.EnvironmentName);

intern statisk ConfigureContainerBuilder Find ConfigureContainerDelegate([DynamicallyAccessedMembers(StartupLinkerOptions.Accessibility)] Skriv startupType, streng miljøNavn)
        {
            var configureMethod = FindMethod(startupType, "Configure{0}Container", environmentName, typeof(void), required: false);
            returner ny ConfigureContainerBuilder(configureMethod);
        }
Se efter Configure metoden

configureBuilder = StartupLoader.FindConfigureDelegate(startupType, kontekst. HostingEnvironment.EnvironmentName);

intern statisk ConfigureBuilder Find ConfigureDelegate([DynamicallyAccessedMembers(StartupLinkerOptions.Accessibility)] Skriv startupType, strengmiljøNavn)
{
    var configureMethod = FindMethod(startupType, "Configure{0}", environmentName, typeof(void), required: true)!;
    returner ny ConfigureBuilder(configureMethod);
}
Kaldet af ConfigureBuilders Build-metode er kildekoden som følger:

privat klasse ConfigureBuilder
        {
            public ConfigureBuilder(MethodInfo configure)
            {
                MethodInfo = konfigurér;
            }

            public MethodInfo MethodInfo { get; }

            offentlig Action<IApplicationBuilder> Build(objektinstans)
            {
                return (applicationBuilder) => Invoke (instance, applicationBuilder);
            }

            privat void Invoke (objektinstans, IApplicationBuilder builder)
            {
                var serviceProvider = builder. Applikationstjenester;
                var parameterInfos = MethodInfo.GetParameters();
                var parameters = nyt objekt[parameterInfos.Length];
                for (var-indeks = 0; indeks < parameterInfos.Længde; indeks++)
                {
                    var parameterInfo = parameterInfos[index];
                    hvis (parameterInfo.ParameterType == typeof(IApplicationBuilder))
                    {
                        parametre[index] = bygger;
                    }
                    ellers
                    {
                        Prøv
                        {
                            parameters[index] = serviceProvider.GetRequiredService(parameterInfo.ParameterType);
                        }
                        catch (Undtagelse f.eks.)
                        {
                            smid ny InvalidOperationException(
                                Resources.FormatMiddlewareFilter_ServiceResolutionFail(
                                    parameterInfo.ParameterType.FuldNavn,
                                    parameterInfo.Name,
                                    MethodInfo.Name,
                                    MetodeInfo.DeclaringType.FuldNavn),
                                f.eks.);
                        }
                    }
                }
                MethodInfo.Invoke(instans, parametre);
            }
        }
Kør-metoden

Adressen til HostingAbstractionsHostExtensions udvidelsesmetode:

Hyperlink-login er synlig.


Til sidst ringer han:

/// <summary>
        Kører en applikation og returnerer en opgave, der kun fuldføres, når tokenet udløses eller nedlukning aktiveres.
        /// </summary>
        <param name="host">Den <se cref="IHost"/> at køre.</param>
        <param name="token">Tokenet til at udløse nedlukning.</param>
        <returns><se cref="Task"/>, der repræsenterer den asynkrone operation.</returns>
        offentlig statisk asynkron Task RunAsync (denne IHost-vært, CancellationToken token = standard)
        {
            Prøv
            {
                Vent på værten. StartAsync (token). ConfigureAwait (falsk);

                Vent på værten. WaitForShutdownAsync(token). ConfigureAwait (falsk);
            }
            Endelig
            {
                if (værten er IAsyncDisposable asyncDisposable)
                {
                    await asyncDisposable.DisposeAsync(). ConfigureAwait (falsk);
                }
                ellers
                {
                    vært. Bortskaff();
                }

            }
        }
Tidligere, da jeg byggede en tjeneste, registrerede jeg mig for IHost-tjenesten, og koden er som følger:

tjenester. AddSingleton<IHost>(_ =>
            {
                returner ny Internal.Host(_appServices,
                    _appServices.GetRequiredService<IHostApplicationLifetime>(),
                    _appServices.GetRequiredService<ILogger<Internal.Host>>(),
                    _appServices.GetRequiredService<IHostLifetime>(),
                    _appServices.GetRequiredService<IOptions<HostOptions>>());
            });
StartAsync-metoden

Adresse:Hyperlink-login er synlig.

offentlig asynkron OpgavestartAsynk (CancellationToken annulleringToken = standard)
        {
            _logger. Start();

            using var combinedCancellationTokenSource = CancellationTokenSource.CreateLinkedTokenSource(cancellationToken, _applicationLifetime.ApplicationStopping);
            CancellationToken kombineretAnnulleringsToken = kombineretAnnulleringTokenKilde.Token;

            vent _hostLifetime.WaitForStartAsync(combinedCancellationToken). ConfigureAwait (falsk);

            combinedCancellationToken.ThrowIfCancellationRequested();
            _hostedServices = Services.GetService<IEnumerable<IHostedService>>();

            foreach (IHostedService hostede Service i _hostedServices)
            {
                Brand IHostedService.Start
                await hostedService.StartAsync(combinedCancellationToken). ConfigureAwait (falsk);

                hvis (hostedService er Baggrundstjeneste baggrundstjeneste)
                {
                    _ = HandleBackgroundException(backgroundService);
                }
            }

            Fire IHostApplicationLifetime.Startede
            _applicationLifetime. NotifyStarted();

            _logger. Started();
        }
(Slut)




Tidligere:Sene nytilkomne rapporter
Næste:.NET Core-fejl i Linux fejlbehandlingsapplikationspakke
Opslået den 22-9-2021 kl. 20:45:12 |
Lær at lære...
Ansvarsfraskrivelse:
Al software, programmeringsmaterialer eller artikler udgivet af Code Farmer Network er kun til lærings- og forskningsformål; Ovenstående indhold må ikke bruges til kommercielle eller ulovlige formål, ellers skal brugerne bære alle konsekvenser. Oplysningerne på dette site kommer fra internettet, og ophavsretstvister har intet med dette site at gøre. Du skal slette ovenstående indhold fuldstændigt fra din computer inden for 24 timer efter download. Hvis du kan lide programmet, så understøt venligst ægte software, køb registrering og få bedre ægte tjenester. Hvis der er nogen overtrædelse, bedes du kontakte os via e-mail.

Mail To:help@itsvse.com