Šis straipsnis yra veidrodinis mašininio vertimo straipsnis, spauskite čia norėdami pereiti prie originalaus straipsnio.

Rodinys: 59583|Atsakyti: 1

[Šaltinis] ASP.NET Core (7) Išsami sistemos šaltinio kodo analizė

[Kopijuoti nuorodą]
Publikuota: 2021-3-24 13:43:28 | | |
Peržiūra:

ASP.NET Core (VI) DI rankiniu būdu gauna objektų įpurškimo būdą
https://www.itsvse.com/thread-9595-1-1.html

"ASP.NET Core" (penki) yra pagrįstas BŽŪP paskirstytais sandoriais
https://www.itsvse.com/thread-9593-1-1.html

ASP.NET Core(4) filtro vieningas ModelState modelio tikrinimas
https://www.itsvse.com/thread-9589-1-1.html

ASP.NET Core (iii) Dinamiškai kurkite egzempliorius naudodami "ActivatorUtilities"
https://www.itsvse.com/thread-9488-1-1.html

ASP.NET Core (2) Iš naujo paleiskite programą pagal kodą
https://www.itsvse.com/thread-9480-1-1.html

ASP.NET Core (1) naudoja Redis talpyklą
https://www.itsvse.com/thread-9393-1-1.html
Pradėkite pridėdami ASP.NET Core GitHub atvirojo kodo adresą

Hipersaito prisijungimas matomas.
Hipersaito prisijungimas matomas.


asp.net Pagrindinis šaltinio kodo adresas
https://www.itsvse.com/thread-9394-1-1.html


Sukūrus naują projektą ASP.NET "Core 3.1", programos kodas yra toks:

Mes giliai pasinėrėme į įvesties kodą kartu su "GitHub" šaltinio kodu.

Pagrindinio kompiuterio kodas:Hipersaito prisijungimas matomas.

CreateDefaultBuilder metodas

Čia sukuriame "HostBuilder" objektą, kuris paveldi iš "IHostBuilder", ir pridedame sistemos apibrėžtus atstovus, pvz., :appsettings.json, "appsettings". {env. EnvironmentName}.json konfigūracijos failą, kuris galiausiai pateiks: IHostBuilder sąsaja.

HostBuilder kodas:Hipersaito prisijungimas matomas.

Galiausiai bus iškviestas "Build" metodas.


viešasis IHost Build()
{
    jei (_hostBuilt)
    {
        pateikti naują InvalidOperationException(SR. BuildCalled);
    }
    _hostBuilt = teisinga;

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

    grąžinti _appServices.GetRequiredService<IHost>();
}
BuildHostConfiguration metodas

privatus IConfiguration _hostConfiguration;
IConfigurationBuilder configBuilder = naujas ConfigurationBuilder()
Paskambinkite atstovui, kad paeiliui pridėtumėte konfigūraciją

CreateHostingEnvironment metodas

privatus HostingEnvironment _hostingEnvironment;
_hostingEnvironment = nauja HostingEnvironment()
{
    ApplicationName = _hostConfiguration[HostDefaults.ApplicationKey],
    EnvironmentName = _hostConfiguration[HostDefaults.EnvironmentKey] ?? Aplinkos.Gamyba,
    ContentRootPath = ResolveContentRootPath(_hostConfiguration[HostDefaults.ContentRootKey], AppContext.BaseDirectory),
};
CreateHostBuilderContext metodas

privatus HostBuilderContext _hostBuilderContext;
_hostBuilderContext = naujas HostBuilderContext(Properties)
{
    HostingEnvironment = _hostingEnvironment,
    Konfigūracija = _hostConfiguration
};
BuildAppConfiguration metodas

Dar kartą integruokite konfigūracijos informaciją

IConfigurationBuilder configBuilder = naujas ConfigurationBuilder()
                . SetBasePath(_hostingEnvironment.ContentRootPath)
                . AddConfiguration(_hostConfiguration, shouldDisposeConfiguration: true);
_appConfiguration = configBuilder.Build();
            _hostBuilderContext.Konfigūracija = _appConfiguration;
CreateServiceProvider metodas

var paslaugos = naujas ServiceCollection();
Užregistruokite paslaugą, iškvieskite atstovą ir įtraukite vartotojo apibrėžtą tarnybą.

GenericHostBuilderExtensions plėtinio metodas

Hipersaito prisijungimas matomas.

KonfigūruotiWebHost plėtinio metodas

Norėdami užregistruoti "GenericWebHostService" kaip vidinę paslaugą:


statybininkas. ConfigureServices((kontekstas, paslaugos) => paslaugos. AddHostedService<GenericWebHostService>());
GenericWebHostService kodas:Hipersaito prisijungimas matomas.


public async Task StartAsync(CancellationToken cancellationToken)
        {
            HostingEventSource.Log.HostStart();

            var serverAddressesFeature = Server.Features.Get<IServerAddressesFeature>();
            var addresses = serverAddressesFeature?. Adresai;
            if (adresai != null && !adresai. IsReadOnly && adresai. Skaičius == 0)
            {
                var urls = Konfigūracija[WebHostDefaults.ServerUrlsKey];
                Jei (!eilutė. IsNullOrEmpty(urls))
                {
                    serverAddressesFeature!. PreferHostingUrls = WebHostUtilities.ParseBool(Konfigūracija, WebHostDefaults.PreferHostingUrlsKey);

                    foreach (var reikšmė url. Split('; ', StringSplitOptions.RemoveEmptyEntries))
                    {
                        adresai. Pridėtinė (vertė);
                    }
                }
            }

            RequestDelegate? taikymas = nulinis;

            Pabandykite
            {
                var configure = Options.ConfigureApplication;

                if (konfigūruoti == null)
                {
                    mesti naują InvalidOperationException($"Nesukonfigūruota jokia programa. Nurodykite programą naudodami IWebHostBuilder.UseStartup, IWebHostBuilder.Configure, arba nurodykite paleisties rinkinį per {nameof(WebHostDefaults.StartupAssemblyKey)} žiniatinklio prieglobos konfigūracija.");
                }

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

                foreach (var filtras StartupFilters.Reverse())
                {
                    konfigūruoti = filtras. Konfigūruoti(konfigūruoti);
                }

                konfigūruoti (kūrėjas);

                Užklausų srauto kūrimas
                programa = statybininkas. Statyti ();
            }
            laimikis (išimtis ex)
            {
                Logger.ApplicationError(ex);

                jei (! Options.WebHostOptions.CaptureStartupErrors)
                {
                    mesti;
                }

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

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

            var httpApplication = nauja HostingApplication(programa, Logger, DiagnosticListener, HttpContextFactory);

            laukti Server.StartAsync(httpApplication, cancellationToken);

            if (adresai != null)
            {
                foreach (var adresas adresuose)
                {
                    LifetimeLogger.ListeningOnAddress(adresas);
                }
            }

            if (Logger.IsEnabled(LogLevel.Debug))
            {
                foreach (var asamblėja Options.WebHostOptions.GetFinalHostingStartupAssemblies())
                {
                    Logger.StartupAssemblyLoaded(surinkimas);
                }
            }

            if (Options.HostingStartupExceptions != null)
            {
                foreach (var išimtis Options.HostingStartupExceptions.InnerExceptions)
                {
                    Logger.HostingStartupAssemblyError(išimtis);
                }
            }
        }


var webhostBuilder = naujas GenericWebHostBuilder(kūrėjas, webHostBuilderOptions);
Hipersaito prisijungimas matomas.

WebHostBuilderExtensions plėtinio metodas

Pateikia startupType objektą IWebHostBuilder iškvietimams.

tai IWebHostBuilder hostBuilder
if (hostBuilder yra ISupportsStartup supportsStartup)
{
    grįžti palaikoStartup.UseStartup(startupType);
}
Hipersaito prisijungimas matomas.

GenericWebHostBuilder privatus metodas GenericWebHostBuilder

Dinamiškai sukurkite mūsų paleisties objektą:

pavyzdys ?? = ActivatorUtilities.CreateInstance(naujas HostServiceProvider(webHostBuilderContext), startupType);
kontekste. Ypatybės[_startupKey] = egzempliorius;
Ieškokite metodo "ConfigureServices"

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

vidinis statinis ConfigureServicesBuilder FindConfigureServicesDelegate([DynamicallyAccessedMembers(StartupLinkerOptions.Accessibility)] Tipas startupType, string environmentName)
        {
            var servicesMethod = FindMethod(startupType, "Configure{0}Services", environmentName, typeof(IServiceProvider), required: false)
                ?? FindMethod(startupType, "Configure{0}Services", environmentName, typeof(void), būtina: false);
            grąžinti naują ConfigureServicesBuilder(servicesMethod);
Ieškokite metodo ConfigureContainer

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

vidinis statinis ConfigureContainerBuilder FindConfigureContainerDelegate([DynamicallyAccessedMembers(StartupLinkerOptions.Accessibility)] Tipas startupType, string environmentName)
        {
            var configureMethod = FindMethod(startupType, "Configure{0}Container", environmentName, typeof(void), required: false);
            grąžinti naują ConfigureContainerBuilder(configureMethod);
        }
Ieškokite konfigūravimo metodo

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

vidinis statinis ConfigureBuilder FindConfigureDelegate([DynamicallyAccessedMembers(StartupLinkerOptions.Accessibility)] Tipas startupType, string environmentName)
{
    var configureMethod = FindMethod(startupType, "Configure{0}", environmentName, typeof(void), required: true)!;
    grąžinti naują ConfigureBuilder(configureMethod);
}
Iškviestas "ConfigureBuilder" kūrimo metodu, šaltinio kodas yra toks:

privačios klasės ConfigureBuilder
        {
            viešasis ConfigureBuilder(MethodInfo konfigūruoti)
            {
                MethodInfo = konfigūruoti;
            }

            viešas MethodInfo MethodInfo { gauti; }

            viešasis veiksmo<IApplicationBuilder> kūrimas(objekto egzempliorius)
            {
                return (applicationBuilder) => Invoke(instance, applicationBuilder);
            }

            private void Invoke(objekto egzempliorius, IApplicationBuilder kūrimo priemonė)
            {
                var serviceProvider = kūrėjas. "ApplicationServices";
                var parameterInfos = MethodInfo.GetParameters();
                var parametrai = naujas objektas[parameterInfos.Length];
                for (var indeksas = 0; indekso < parametrasInfos.Length; indeksas++)
                {
                    var parameterInfo = parameterInfos[index];
                    if (parameterInfo.ParameterType == typeof(IApplicationBuilder))
                    {
                        parametrai[indeksas] = kūrėjas;
                    }
                    kitaip
                    {
                        Pabandykite
                        {
                            parameters[index] = serviceProvider.GetRequiredService(parameterInfo.ParameterType);
                        }
                        laimikis (išimtis ex)
                        {
                            mesti naują InvalidOperationException(
                                Resources.FormatMiddlewareFilter_ServiceResolutionFail(
                                    parametrasInfo.ParameterType.FullName,
                                    parameterInfo.Name,
                                    MethodInfo.Name,
                                    MethodInfo.DeclaringType.FullName),
                                ex);
                        }
                    }
                }
                MethodInfo.Invoke(egzempliorius, parametrai);
            }
        }
Vykdymo metodas

HostingAbstractionsHostExtensions plėtinio metodo adresas:

Hipersaito prisijungimas matomas.


Galiausiai skambina:

/// <summary>
        Paleidžia programą ir pateikia užduotį, kuri baigiama tik suaktyvinus atpažinimo ženklą arba suaktyvinus išjungimą.
        /// </summary>
        <param name="host">The <see cref="IHost"/> paleisti.</param>
        <param name="token">Atpažinimo ženklas, skirtas suaktyvinti išjungimą.</param>
        <returns><žr. cref="Užduotis"/>, kuris reiškia asinchroninę operaciją.</returns>
        viešasis statinis asinchroninis Užduotis RunAsync(šis IHost pagrindinis kompiuteris, CancellationToken atpažinimo ženklas = numatytasis)
        {
            Pabandykite
            {
                laukia šeimininko. StartAsync(atpažinimo ženklas). ConfigureAwait(klaidinga);

                laukia šeimininko. WaitForShutdownAsync(atpažinimo ženklas). ConfigureAwait(klaidinga);
            }
            Pabaigoje
            {
                if (pagrindinis kompiuteris yra IAsyncDisposable asyncDisposable)
                {
                    laukti asyncDisposable.DisposeAsync(). ConfigureAwait(klaidinga);
                }
                kitaip
                {
                    šeimininkas. Išmesti();
                }

            }
        }
Anksčiau, kai kurdavau paslaugą, užsiregistruodavau IHost paslaugai, o kodas yra toks:

paslaugų. AddSingleton<IHost>(_ =>
            {
                grąžinti naują Internal.Host(_appServices,
                    _appServices.GetRequiredService<IHostApplicationLifetime>(),
                    _appServices.GetRequiredService<ILogger<Internal.Host>>(),
                    _appServices.GetRequiredService<IHostLifetime>(),
                    _appServices.GetRequiredService<IOptions<HostOptions>>());
            });
StartAsync metodas

Adresas:Hipersaito prisijungimas matomas.

public async Task StartAsync(CancellationToken cancellationToken = default)
        {
            _logger. Pradžia();

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

            laukti _hostLifetime.WaitForStartAsync(combinedCancellationToken). ConfigureAwait(klaidinga);

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

            foreach (IHostedService hostedService _hostedServices)
            {
                Gaisras IHostedService.Start
                laukti hostedService.StartAsync(combinedCancellationToken). ConfigureAwait(klaidinga);

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

            Gaisras IHostApplicationLifetime.Started
            _applicationLifetime.PraneštiPradėta();

            _logger. Pradėta();
        }
(Pabaiga)




Ankstesnis:Vėlyvi pranešimai apie naujokus
Kitą:.NET Core klaida Linux Klaidų apdorojimo programų paketas
Paskelbta 2021-9-22 20:45:12 |
Išmokite mokytis...
Atsakomybės apribojimas:
Visa programinė įranga, programavimo medžiaga ar straipsniai, kuriuos skelbia Code Farmer Network, yra skirti tik mokymosi ir mokslinių tyrimų tikslams; Aukščiau nurodytas turinys negali būti naudojamas komerciniais ar neteisėtais tikslais, priešingu atveju vartotojai prisiima visas pasekmes. Šioje svetainėje pateikiama informacija gaunama iš interneto, o ginčai dėl autorių teisių neturi nieko bendra su šia svetaine. Turite visiškai ištrinti aukščiau pateiktą turinį iš savo kompiuterio per 24 valandas nuo atsisiuntimo. Jei jums patinka programa, palaikykite autentišką programinę įrangą, įsigykite registraciją ir gaukite geresnes autentiškas paslaugas. Jei yra kokių nors pažeidimų, susisiekite su mumis el. paštu.

Mail To:help@itsvse.com