See artikkel on masintõlke peegelartikkel, palun klõpsake siia, et hüpata algse artikli juurde.

Vaade: 59583|Vastuse: 1

[Allikas] ASP.NET Core (7) Raamistiku lähtekoodi põhjalik analüüs

[Kopeeri link]
Postitatud 2021-3-24 13:43:28 | | |
Läbivaatamine:

ASP.NET Core (VI) DI saab käsitsi objektide süstimise meetodi
https://www.itsvse.com/thread-9595-1-1.html

ASP.NET Core (viis) põhineb CAP hajutatud tehingutel
https://www.itsvse.com/thread-9593-1-1.html

ASP.NET Core(4) filter ühtlustatud ModelState mudeli valideerimine
https://www.itsvse.com/thread-9589-1-1.html

ASP.NET Core (iii) Dünaamiliselt loo instantse ActivatorUtilities abil
https://www.itsvse.com/thread-9488-1-1.html

ASP.NET Core (2) Taaskäivita rakendus koodi järgi
https://www.itsvse.com/thread-9480-1-1.html

ASP.NET Core (1) kasutab Redis vahemällu salvestamist
https://www.itsvse.com/thread-9393-1-1.html
Alusta ASP.NET Core GitHubi avatud lähtekoodiga aadressi lisamisest

Hüperlingi sisselogimine on nähtav.
Hüperlingi sisselogimine on nähtav.


asp.net Põhilähtekoodi aadress
https://www.itsvse.com/thread-9394-1-1.html


Pärast uue projekti loomist Core 3.1 ASP.NET on programmi kood järgmine:

Me süvenesime sissepääsukoodi koos GitHubi lähtekoodiga.

Hostkood:Hüperlingi sisselogimine on nähtav.

CreateDefaultBuilder meetod

Siin instantsierime HostBuilderi objekti, mis pärib IHostBuilderilt, ning lisame süsteemimääratletud delegaadid, nagu :appsettings.json, rakendusseaded. {env. EnvironmentName}.json konfiguratsioonifail, mis lõpuks tagastab: IHostBuilder liides.

HostBuilderi kood:Hüperlingi sisselogimine on nähtav.

Ehitusmeetod kutsutakse lõpuks välja.


avalik IHost Build()
{
    if (_hostBuilt)
    {
        viska uus InvalidOperationException(SR. BuildCalled);
    }
    _hostBuilt = tõene;

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

    tagasta _appServices.GetRequiredService<IHost>();
}
BuildHostConfiguration meetod

privaatne IConfiguration _hostConfiguration;
IConfigurationBuilder configBuilder = uus ConfigurationBuilder()
Helista delegaadile, et lisada konfiguratsioon

CreateHostingEnvironment meetod

privaatne HostingEnvironment _hostingEnvironment;
_hostingEnvironment = uus HostingEnvironment()
{
    ApplicationName = _hostConfiguration[HostDefaults.ApplicationKey],
    EnvironmentName = _hostConfiguration[HostDefaults.EnvironmentKey] ?? Keskkonnad. Tootmine,
    ContentRootPath = ResolveContentRootPath(_hostConfiguration[HostDefaults.ContentRootKey], AppContext.BaseDirectory),
};
CreateHostBuilderContext meetod

privaatne HostBuilderContext _hostBuilderContext;
_hostBuilderContext = uus HostBuilderContext(Properties)
{
    HostingEnvironment = _hostingEnvironment,
    Konfiguratsioon = _hostConfiguration
};
BuildAppConfiguration meetod

Integreeri konfiguratsiooniinfo uuesti

IConfigurationBuilder configBuilder = uus ConfigurationBuilder()
                . SetBasePath(_hostingEnvironment.ContentRootPath)
                . AddConfiguration(_hostConfiguration, shouldDisposeConfiguration: true);
_appConfiguration = configBuilder.Build();
            _hostBuilderContext.Konfiguratsioon = _appConfiguration;
CreateServiceProvider meetod

var services = uus ServiceCollection();
Registreeri teenus, helista delegaadile ja lisa kasutaja määratud teenus.

GenericHostBuilderExtensions laiendusmeetod

Hüperlingi sisselogimine on nähtav.

ConfigureWebHost laiendusmeetod

GenericWebHostService'i registreerimiseks taustateenusena:


Ehitaja. ConfigureServices((kontekst, teenused) => teenused. AddHostedService<GenericWebHostService>());
GenericWebHostService kood:Hüperlingi sisselogimine on nähtav.


avalik asünkroonne ülesanne StartAsync(CancellationToken cancellationToken)
        {
            HostEventSource.Log.HostStart();

            var serverAddressesFeature = Server.Features.Get<IServerAddressesFeature>();
            var aadressid = serverAddressesFeature?. Aadressid;
            kui (aadressid != null && !aadressid. IsReadOnly && aadressid. Loendus == 0)
            {
                var urls = Configuration[WebHostDefaults.ServerUrlsKey];
                if (!string. IsNullOrEmpty(urls))
                {
                    serverAddressesFeature!. PreferHostingUrls = WebHostUtilities.ParseBool(Configuration, WebHostDefaults.PreferHostingUrlsKey);

                    foreach (VAR väärtus URL-ides. Split('; ', StringSplitOptions.RemoveEmptyEntries))
                    {
                        aadressid. Lisand(väärtus);
                    }
                }
            }

            RequestDelegate? rakendus = null;

            proovi
            {
                var config = Options.ConfigureApplication;

                if (configure == null)
                {
                    viska uus InvalidOperationException($"Rakendust pole seadistatud. Palun määrake rakendus IWebHostBuilder.UseStartup, IWebHostBuilder.Configure'i kaudu või määrake käivitusassamblee {nameof(WebHostDefaults.StartupAssemblyKey)} kaudu veebimajutuse seadistus.");
                }

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

                foreach (var filter in StartupFilters.Reverse())
                {
                    configure = filter. konfigureerida (konfigureerida);
                }

                configure(builder);

                Ehita päringutoru
                rakendus = ehitaja. Build();
            }
            catch (Exception ex)
            {
                Logger.ApplicationError(ex);

                kui (! Options.WebHostOptions.CaptureStartupErrors)
                {
                    viskamine;
                }

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

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

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

            await Server.StartAsync(httpApplication, cancellationToken);

            if (aadressid != null)
            {
                foreach (VAR-aadress aadressides)
                {
                    LifetimeLogger.ListeningOnAddress(aadress);
                }
            }

            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 = uus GenericWebHostBuilder (builder, webHostBuilderOptions);
Hüperlingi sisselogimine on nähtav.

WebHostBuilderExtensions laiendusmeetod

Pakub startupType objekti IWebHostBuilder kutsete jaoks.

see IWebHostBuilder hostBuilder
if (hostBuilder on ISupportsStartup supportsStartup)
{
    return supportsStartup.UseStartup(startupType);
}
Hüperlingi sisselogimine on nähtav.

GenericWebHostBuilder privaatmeetod GenericWebHostBuilder

Dünaamiliselt instantsieerida meie Startup-objekt:

Instants ?? = ActivatorUtilities.CreateInstance(uus HostServiceProvider(webHostBuilderContext), startupType);
Kontekst. Properties[_startupKey] = eksemplar;
Otsi ConfigureServices meetodit

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

sisemine staatiline ConfigureServicesBuilder FindConfigureServicesDelegate([DynamicallyAccessedMembers(StartupLinkerOptions.Accessibility)] Type startupType, string environmentName)
        {
            var servicesMethod = FindMethod(startupType, "Configure{0}Services", environmentName, typeof(IServiceProvider), vajalik: väär)
                ?? FindMethod(startupType, "Configure{0}Services", environmentName, typeof(void), vajalik: false);
            tagasta uus ConfigureServicesBuilder(servicesMethod);
Otsi ConfigureContainer meetodit

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

sisemine staatiline ConfigureContainerBuilder FindConfigureContainerDelegate([DynamicallyAccessedMembers(StartupLinkerOptions.Accessibility)] Type startupType, string environmentName)
        {
            var configureMethod = FindMethod(startupType, "Configure{0}Container", environmentName, typeof(void), required: false);
            return new ConfigureContainerBuilder(configureMethod);
        }
Otsi Configure meetodit

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

sisemine staatiline ConfigureBuilder FindConfigureDelegate([DynamicallyAccessedMembers(StartupLinkerOptions.Accessibility)] Type startupType, string environmentName)
{
    var configureMethod = FindMethod(startupType, "Configure{0}", environmentName, typeof(void), required: true)!;
    return new ConfigureBuilder(configureMethod);
}
ConfigureBuilderi Build meetodi järgi kutsutud lähtekood on järgmine:

privaatklass ConfigureBuilder
        {
            public ConfigureBuilder(MethodInfo configure)
            {
                MethodInfo = seadistada;
            }

            public MethodInfo MethodInfo { get; }

            public Action<IApplicationBuilder> Build (objekti eksemplar)
            {
                return (applicationBuilder) => Invoke(instance, applicationBuilder);
            }

            private void Invoke(object instance, IApplicationBuilder builder)
            {
                var serviceProvider = ehitaja. ApplicationServices;
                var parameterInfos = MethodInfo.GetParameters();
                var parameetrid = uus objekt[parameterInfos.Length];
                for (var indeks = 0; indeks < parameeterInfos.Pikkus; indeks++)
                {
                    var parameterInfo = parameterInfos[index];
                    if (parameterInfo.ParameterType == typeof(IApplicationBuilder))
                    {
                        parameetrid[indeks] = ehitaja;
                    }
                    else
                    {
                        proovi
                        {
                            parameters[index] = serviceProvider.GetRequiredService(parameterInfo.ParameterType);
                        }
                        catch (Exception ex)
                        {
                            viska uus InvalidOperationException(
                                Resources.FormatMiddlewareFilter_ServiceResolutionFail(
                                    parameterInfo.ParameterType.FullName,
                                    parameterInfo.Name,
                                    MethodInfo.Name,
                                    MethodInfo.DeclaringType.FullName),
                                ex);
                        }
                    }
                }
                MethodInfo.Invoke(instance, parameters);
            }
        }
Run-meetod

HostingAbstractionsHostExtensions laienduse meetodi aadress:

Hüperlingi sisselogimine on nähtav.


Lõpuks helistab:

/// <summary>
        Käivitab rakenduse ja tagastab ülesande, mis lõpeb ainult siis, kui token käivitatakse või käivitatakse väljalülitus.
        /// </summary>
        <param name="host"> <vt cref="IHost"/> käivitamiseks.</param>
        <param name="token">Token, mis käivitab sulgemise.</param>
        <returns><see cref="Task"/>, mis esindab asünkroonset operatsiooni.</returns>
        avalik staatiline asünkroonne ülesanne RunAsync (see IHost host, CancellationToken token = vaikimisi)
        {
            proovi
            {
                Oota peremeest. StartAsync (token). ConfigureAwait (vale);

                Oota peremeest. WaitForShutdownAsync(token). ConfigureAwait (vale);
            }
            lõpuks
            {
                if (host on IAsyncDisposable asyncDisposable)
                {
                    oota asyncDisposable.DisposeAsync(). ConfigureAwait (vale);
                }
                else
                {
                    Saatejuht. Dispose();
                }

            }
        }
Varem, kui ma teenust ehitasin, registreerusin IHost teenusele ja kood oli järgmine:

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

Aadress:Hüperlingi sisselogimine on nähtav.

avalik asünkroonne ülesanne StartAsync(CancellationToken cancellationToken = vaikimisi)
        {
            _logger. Starting();

            kasutades var combinedCancellationTokenSource = CancellationTokenSource.CreateLinkedTokenSource(cancellationToken, _applicationLifetime.ApplicationStopping);
            CancellationToken combinedCancellationToken = combinedCancellationTokenSource.Token;

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

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

            foreach (IHostedService hostedService _hostedServices)
            {
                Tulekahju IHostedService.Alusta
                await hostedService.StartAsync(combinedCancellationToken). ConfigureAwait (vale);

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

            Tulekahju IHostApplicationLifetime. Alustatud
            _applicationLifetime.NotifyStarted();

            _logger. Start();
        }
(Lõpp)




Eelmine:Hilised uustulnukad teated
Järgmine:.NET Core viga Linux Failure Processing rakenduste komplektis
Postitatud 2021-9-22 20:45:12 |
Õpi õppima...
Disclaimer:
Kõik Code Farmer Networki poolt avaldatud tarkvara, programmeerimismaterjalid või artiklid on mõeldud ainult õppimiseks ja uurimistööks; Ülaltoodud sisu ei tohi kasutada ärilistel ega ebaseaduslikel eesmärkidel, vastasel juhul kannavad kasutajad kõik tagajärjed. Selle saidi info pärineb internetist ning autoriõiguste vaidlused ei ole selle saidiga seotud. Ülaltoodud sisu tuleb oma arvutist täielikult kustutada 24 tunni jooksul pärast allalaadimist. Kui sulle programm meeldib, palun toeta originaaltarkvara, osta registreerimist ja saa paremaid ehtsaid teenuseid. Kui esineb rikkumist, palun võtke meiega ühendust e-posti teel.

Mail To:help@itsvse.com