Ta članek je zrcalni članek strojnega prevajanja, kliknite tukaj za skok na izvirni članek.

Pogled: 59583|Odgovoriti: 1

[Vir] ASP.NET Jedro (7) Poglobljena analiza izvorne kode ogrodja

[Kopiraj povezavo]
Objavljeno 24. 3. 2021 ob 13:43:28 | | |
Pregled:

ASP.NET Core (VI) DI ročno pridobi metodo vbrizgavanja objektov
https://www.itsvse.com/thread-9595-1-1.html

ASP.NET Core (pet) temelji na CAP distribuiranih transakcijah
https://www.itsvse.com/thread-9593-1-1.html

ASP.NET Core(4) filter unifikiran validacija modelov ModelState
https://www.itsvse.com/thread-9589-1-1.html

ASP.NET Jedro (iii) Dinamično ustvarjanje instanc z uporabo ActivatorUtilities
https://www.itsvse.com/thread-9488-1-1.html

ASP.NET Jedro (2) Ponovni zagon aplikacije s kodo
https://www.itsvse.com/thread-9480-1-1.html

ASP.NET Core (1) uporablja Redis predpomnjenje
https://www.itsvse.com/thread-9393-1-1.html
Začnite tako, da priključite odprtokodni naslov ASP.NET Core GitHub

Prijava do hiperpovezave je vidna.
Prijava do hiperpovezave je vidna.


asp.net Naslov izvorne kode jedra
https://www.itsvse.com/thread-9394-1-1.html


Po ustvarjanju novega projekta ASP.NET Core 3.1 je programska koda naslednja:

Poglobljeno smo se poglobili v vhodno kodo v kombinaciji z izvorno kodo GitHuba.

Koda gostitelja:Prijava do hiperpovezave je vidna.

Metoda CreateDefaultBuilder

Tukaj instanciramo objekt HostBuilder, ki podeduje IHostBuilder, in dodamo sistemsko definirane delegate, kot so :appsettings.json, appsettings. {env. EnvironmentName}.json konfiguracijska datoteka, ki se bo sčasoma vrnila: vmesnik IHostBuilder.

Koda HostBuilder:Prijava do hiperpovezave je vidna.

Metoda Build bo na koncu uporabljena.


public IHost Build()
{
    če (_hostBuilt)
    {
        vrzi novo InvalidOperationException(SR. BuildCalled);
    }
    _hostBuilt = resnično;

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

    return _appServices.GetRequiredService<IHost>();
}
Metoda BuildHostConfiguration

zasebni _hostConfiguration za IConfiguracijo;
IConfigurationBuilder configBuilder = novi ConfigurationBuilder()
Pokliči delegata, da doda konfiguracijo nato

Metoda CreateHostingEnvironment

zasebno HostEnvironment _hostingEnvironment;
_hostingEnvironment = nov HostEnvironment()
{
    ApplicationName = _hostConfiguration[HostDefaults.ApplicationKey],
    EnvironmentName = _hostConfiguration[HostDefaults.EnvironmentKey] ?? Okolja.Produkcija,
    ContentRootPath = ResolveContentRootPath(_hostConfiguration[HostDefaults.ContentRootKey], AppContext.BaseDirectory),
};
Metoda CreateHostBuilderContext

zasebni HostBuilderContext _hostBuilderContext;
_hostBuilderContext = nov HostBuilderContext(Lastnosti)
{
    HostEnvironment = _hostingEnvironment,
    Konfiguracija = _hostConfiguration
};
Metoda BuildAppConfiguration

Ponovno integrirajte konfiguracijske informacije

IConfigurationBuilder configBuilder = novi ConfigurationBuilder()
                . SetBasePath(_hostingEnvironment.ContentRootPath)
                . AddConfiguration(_hostConfiguration, shouldDisposeConfiguration: true);
_appConfiguration = configBuilder.Build();
            _hostBuilderContext.Konfiguracija = _appConfiguration;
Metoda CreateServiceProvider

var services = nova ServiceCollection();
Registrirajte storitev, pokličite delegata in dodajte uporabniško definirano storitev.

Metoda razširitve GenericHostBuilderExtensions

Prijava do hiperpovezave je vidna.

Metoda razširitve ConfigureWebHost

Za registracijo GenericWebHostService kot backend storitve:


graditelj. ConfigureServices((context, services) => services. AddHostedService<GenericWebHostService>());
GenericWebHostService koda:Prijava do hiperpovezave je vidna.


javno asinhrona naloga StartAsync(CancellationToken cancellationToken)
        {
            HostEventSource.Log.HostStart();

            var serverAddressesFeature = Server.Features.Get<IServerAddressesFeature>();
            var addresses = serverAddressesFeature?. Naslovi;
            if (naslovi != null & !naslovi. IsReadOnly & naslovi. Število == 0)
            {
                var urls = Configuration[WebHostDefaults.ServerUrlsKey];
                if (!string. IsNullOrEmpty(urls))
                {
                    serverAddressesFeature!. PreferHostingUrls = WebHostUtilities.ParseBool(Configuration, WebHostDefaults.PreferHostingUrlsKey);

                    Foreach (VAR vrednost v URL-jih. Split('; ', StringSplitOptions.RemoveEmptyEntry))
                    {
                        Naslovi. Add(value);
                    }
                }
            }

            RequestDelegate? uporaba = nič;

            poskusi
            {
                var configure = Options.ConfigureApplication;

                if (configure == null)
                {
                    vrzi novo InvalidOperationException($"Ni konfigurirane aplikacije. Prosimo, določite aplikacijo preko IWebHostBuilder.UseStartup, IWebHostBuilder.Configure ali z določitvijo zagonskega asemblerja preko {nameof(WebHostDefaults.StartupAssemblyKey)} v konfiguracija spletnega gostitelja.");
                }

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

                foreach (var filter v StartupFilters.Reverse())
                {
                    configure = filter. Konfiguriraj (konfiguriraj);
                }

                configure(builder);

                Zgradite cevovod za zahteve
                Uporaba = graditelj. build();
            }
            ulov (Izjema ex)
            {
                Logger.ApplicationError(ex);

                če (! Options.WebHostOptions.CaptureStartupErrors)
                {
                    met;
                }

                var showDetailedErrors = HostEnvironment.IsDevelopment() || Možnosti.WebGostiteljMožnosti.PodrobneNapake;

                aplikacija = ErrorPageBuilder.BuildErrorPageApplication(HostingEnvironment.ContentRootFileProvider, Logger, showDetailedErrors, ex);
            }

            var httpApplication = nova HostApplication(application, Logger, DiagnosticListener, HttpContextFactory);

            await Server.StartAsync(httpApplication, cancellationToken);

            if (naslavlja != ničl)
            {
                foreach (var naslov v naslovih)
                {
                    LifetimeLogger.ListeningOnAddress(address);
                }
            }

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

            if (Options.HostingStartupExceptions != null)
            {
                foreach (var exception in Options.HostingStartupExceptions.InnerExceptions)
                {
                    Logger.HostingStartupAssemblyError(exception);
                }
            }
        }


var webhostBuilder = novi GenericWebHostBuilder(builder, webHostBuilderOptions);
Prijava do hiperpovezave je vidna.

Metoda razširitve WebHostBuilderExtensions

Zagotavlja objekt startupType za klice IWebHostBuilder.

ta IWebHostBuilder hostBuilder
if (hostBuilder is ISupportsStartup supportsStartup)
{
    return supportsStartup.UseStartup(startupType);
}
Prijava do hiperpovezave je vidna.

GenericWebHostBuilder Zasebna metoda GenericWebHostBuilder

Dinamično instancirajte naš objekt Startup:

Primer ?? = ActivatorUtilities.CreateInstance(novi HostServiceProvider(webHostBuilderContext), startupType);
Kontekst. Lastnosti[_startupKey] = primer;
Poiščite metodo ConfigureServices

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

internal static ConfigureServicesBuilder Najdi ConfigureServicesDelegate([DynamicallyAccessedMembers(StartupLinkerOptions.Accessibility)] Tip startupType, string okoljeIme)
        {
            var servicesMethod = FindMethod(startupType, "Configure{0}Services", environmentName, typeof(IServiceProvider), required: false)
                ?? FindMethod(startupType, "Configure{0}Services", environmentName, typeof(void), required: false);
            return new ConfigureServicesBuilder(servicesMethod);
Poišči metodo ConfigureContainer

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

internal static ConfigureContainerBuilder FindConfigureContainerDelegate([DynamicallyAccessedMembers(StartupLinkerOptions.Accessibility)] Tip startupType, string okoljeIme)
        {
            var configureMethod = FindMethod(startupType, "Configure{0}Container", environmentName, typeof(void), required: false);
            return new ConfigureContainerBuilder(configureMethod);
        }
Poišči metodo Configure

configureBuilder = StartupLoader.FindConfigureDelegate(startupType, context. HostEnvironment.EnvironmentName);

notranji statični ConfigureBuilder Najdi ConfigureDelegate([DynamicallyAccessedMembers(StartupLinkerOptions.Accessibility)] Tip startupType, string environmentName)
{
    var configureMethod = FindMethod(startupType, "Configure{0}", environmentName, typeof(void), required: true)!;
    vrni nov ConfigureBuilder(configureMethod);
}
Izvorna koda, ki jo imenuje ConfigureBuilderjeva metoda Build, je naslednja:

zasebni razred ConfigureBuilder
        {
            public ConfigureBuilder(MethodInfo configure)
            {
                MethodInfo = konfiguriraj;
            }

            public MethodInfo MethodInfo { get; }

            javni<IApplicationBuilder> Action Build (instanca objekta)
            {
                return (applicationBuilder) => Invoke(instance, applicationBuilder);
            }

            private void Invoke(instanca objekta, IApplicationBuilder builder)
            {
                var serviceProvider = builder. Aplikacijske storitve;
                var parameterInfos = MethodInfo.GetParameters();
                parametri var = nov objekt[parameterInfos.Length];
                za (var index = 0; index < parameterInfos.Length; index++)
                {
                    var parameterInfo = parameterInfos[index];
                    if (parameterInfo.ParameterType == typeof(IApplicationBuilder))
                    {
                        parametri[index] = graditelj;
                    }
                    else
                    {
                        poskusi
                        {
                            parameters[index] = serviceProvider.GetRequiredService(parameterInfo.ParameterType);
                        }
                        ulov (Izjema ex)
                        {
                            vrzi novo InvalidOperationException(
                                Resources.FormatMiddlewareFilter_ServiceResolutionFail(
                                    parameterInfo.ParameterType.FullName,
                                    parameterInfo.Name,
                                    MethodInfo.Name,
                                    MethodInfo.DeclaringType.FullName),
                                ex);
                        }
                    }
                }
                MethodInfo.Invoke(instance, parametri);
            }
        }
Metoda zagona

Naslov metode razširitve HostAbstractionsHostExtensions:

Prijava do hiperpovezave je vidna.


Na koncu pokliče:

/// <summary>
        Zažene aplikacijo in vrne nalogo, ki se zaključi le, ko je žeton sprožen ali ko se sproži izklop.
        /// </summary>
        <param name="host"> The <see cref="IHost"/> za izvajanje.</param>
        <ime parametra="token">Žeton za sprožitev izklopa.</param>
        <returns><glej cref="Naloga"/> predstavlja asinhrono operacijo.</returns>
        javni statični asinhroni Task RunAsync (ta IHost gostitelj, CancellationToken token = privzeto)
        {
            poskusi
            {
                Počakajte na gostitelja. StartAsync(token). ConfigureAwait(false);

                Počakajte na gostitelja. WaitForShutdownAsync(token). ConfigureAwait(false);
            }
            končno
            {
                if (gostitelj je IAsyncDisposable asyncDisposable)
                {
                    await asyncDisposable.DisposeAsync(). ConfigureAwait(false);
                }
                else
                {
                    gostitelj. Dispose();
                }

            }
        }
Prej, ko sem gradil storitev, sem se registriral za storitev IHost, koda pa je bila naslednja:

storitve. AddSingleton<IHost>(_ =>
            {
                return new Internal.Host(_appServices,
                    _appServices.GetRequiredService<IHostApplicationLifetime>(),
                    _appServices.GetRequiredService<ILogger<Internal.Host>>(),
                    _appServices.GetRequiredService<IHostLifetime>(),
                    _appServices.GetRequiredService<IOptions<HostOptions>>());
            });
Metoda StartAsync

Naslov:Prijava do hiperpovezave je vidna.

public async Task StartAsync(CancellationToken cancellationToken = privzeto)
        {
            _logger. Starting();

            uporaba var combinedCancellationTokenSource = CancellationTokenSource.CreateLinkedTokenSource(cancellationToken, _applicationLifetime.ApplicationStopping);
            CancellationToken združeniCancellationToken = združeniCancellationTokenSource.Token;

            await _hostLifetime.WaitForStartAsync(combinedCancellationToken). ConfigureAwait(false);

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

            foreach (IHostedService hostedService v _hostedServices)
            {
                // Fire IHostedService.Start
                await hostedService.StartAsync (combinedCancellationToken). ConfigureAwait(false);

                if (hostedService is BackgroundService backgroundServiceService)
                {
                    _ = HandleBackgroundException(backgroundService);
                }
            }

            // Fire IHostApplicationLifetime.Started
            _applicationLifetime.NotifyStarted();

            _logger. Started();
        }
(Konec)




Prejšnji:Pozna poročila novincev
Naslednji:.NET Core napaka v paketu aplikacij Linux Failure Processing
Objavljeno 22. 9. 2021 ob 20:45:12 |
Nauči se učiti...
Disclaimer:
Vsa programska oprema, programski materiali ali članki, ki jih izdaja Code Farmer Network, so namenjeni zgolj učnim in raziskovalnim namenom; Zgornja vsebina ne sme biti uporabljena v komercialne ali nezakonite namene, sicer uporabniki nosijo vse posledice. Informacije na tej strani prihajajo z interneta, spori glede avtorskih pravic pa nimajo nobene zveze s to stranjo. Zgornjo vsebino morate popolnoma izbrisati z računalnika v 24 urah po prenosu. Če vam je program všeč, podprite pristno programsko opremo, kupite registracijo in pridobite boljše pristne storitve. Če pride do kakršne koli kršitve, nas prosimo kontaktirajte po elektronski pošti.

Mail To:help@itsvse.com