Šis raksts ir mašīntulkošanas spoguļraksts, lūdzu, noklikšķiniet šeit, lai pārietu uz oriģinālo rakstu.

Skats: 59583|Atbildi: 1

[Avots] ASP.NET Core (7) Sistēmas pirmkoda padziļināta analīze

[Kopēt saiti]
Publicēts 2021-3-24 13:43:28 | | |
Pārskats:

ASP.NET Core (VI) DI manuāli iegūst objektu injicēšanas metodi
https://www.itsvse.com/thread-9595-1-1.html

ASP.NET Core (pieci) ir balstīts uz CAP sadalītajiem darījumiem
https://www.itsvse.com/thread-9593-1-1.html

ASP.NET Core(4) filtra vienotā ModelState modeļa validācija
https://www.itsvse.com/thread-9589-1-1.html

ASP.NET Core (iii) Dinamiski izveidojiet instances, izmantojot ActivatorUtilities
https://www.itsvse.com/thread-9488-1-1.html

ASP.NET kodols (2) Restartējiet lietojumprogrammu pēc koda
https://www.itsvse.com/thread-9480-1-1.html

ASP.NET Core (1) izmanto Redis kešatmiņu
https://www.itsvse.com/thread-9393-1-1.html
Sāciet, pievienojot ASP.NET Core GitHub atvērtā koda adresi

Hipersaites pieteikšanās ir redzama.
Hipersaites pieteikšanās ir redzama.


asp.net Pamata avota koda adrese
https://www.itsvse.com/thread-9394-1-1.html


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)




Iepriekšējo:Novēloti jaunpienācēju ziņojumi
Nākamo:.NET Core kļūda Linux kļūmju apstrādes lietojumprogrammu komplektā
Publicēts 2021-9-22 20:45:12 |
Iemācieties mācīties...
Atruna:
Visa programmatūra, programmēšanas materiāli vai raksti, ko publicē Code Farmer Network, ir paredzēti tikai mācību un pētniecības mērķiem; Iepriekš minēto saturu nedrīkst izmantot komerciāliem vai nelikumīgiem mērķiem, pretējā gadījumā lietotājiem ir jāuzņemas visas sekas. Informācija šajā vietnē nāk no interneta, un autortiesību strīdiem nav nekāda sakara ar šo vietni. Iepriekš minētais saturs ir pilnībā jāizdzēš no datora 24 stundu laikā pēc lejupielādes. Ja jums patīk programma, lūdzu, atbalstiet oriģinālu programmatūru, iegādājieties reģistrāciju un iegūstiet labākus oriģinālus pakalpojumus. Ja ir kādi pārkāpumi, lūdzu, sazinieties ar mums pa e-pastu.

Mail To:help@itsvse.com