Denna artikel är en spegelartikel om maskinöversättning, klicka här för att hoppa till originalartikeln.

Utsikt: 59583|Svar: 1

[Källa] ASP.NET Core (7) Djupgående analys av ramverkets källkod

[Kopiera länk]
Publicerad den 2021-3-24 13:43:28 | | |
Recension:

ASP.NET Core (VI) DI hämtar manuellt metoden för att injicera objekt
https://www.itsvse.com/thread-9595-1-1.html

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

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

ASP.NET Core (iii) Skapa instanser dynamiskt med hjälp av ActivatorUtilities
https://www.itsvse.com/thread-9488-1-1.html

ASP.NET Core (2) Starta om applikationen via kod
https://www.itsvse.com/thread-9480-1-1.html

ASP.NET Core (1) använder Redis-cachelagring
https://www.itsvse.com/thread-9393-1-1.html
Börja med att bifoga den ASP.NET Core GitHub-open source-adressen

Inloggningen med hyperlänken är synlig.
Inloggningen med hyperlänken är synlig.


asp.net Kärnkällkodsadress
https://www.itsvse.com/thread-9394-1-1.html


Efter att ha skapat ett nytt projekt ASP.NET Core 3.1 är programkoden följande:

Vi gjorde en djupdykning i inmatningskoden kombinerat med GitHubs källkod.

Värdkod:Inloggningen med hyperlänken är synlig.

CreateDefaultBuilder-metoden

Här instansierar vi ett HostBuilder-objekt, som ärver från IHostBuilder, och lägger till systemdefinierade delegater, såsom :appsettings.json, appsettings. {env. EnvironmentName}.json konfigurationsfil, som så småningom kommer att returnera: IHostBuilder-gränssnittet.

HostBuilder-kod:Inloggningen med hyperlänken är synlig.

Byggmetoden kommer så småningom att anropas.


offentlig IHost Build()
{
    om (_hostBuilt)
    {
        kasta ny InvalidOperationException(SR. BuildCalled);
    }
    _hostBuilt = sant;

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

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

privat IConfiguration _hostConfiguration;
IConfigurationBuilder configBuilder = ny ConfigurationBuilder()
Ring delegaten för att lägga till konfiguration i sin tur

CreateHostingEnvironment-metoden

privat HostingEnvironment _hostingEnvironment;
_hostingEnvironment = ny 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

Integrera konfigurationsinformationen igen

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

var services = ny ServiceCollection();
Registrera en tjänst, kalla en delegat och lägg till en användardefinierad tjänst.

GenericHostBuilderExtensions extensionsmetoden

Inloggningen med hyperlänken är synlig.

ConfigureWebHost-förlängningsmetoden

För att registrera GenericWebHostService som en backend-tjänst:


byggare. ConfigureServices((context, services) => services. AddHostedService<GenericWebHostService>());
GenericWebHostService-kod:Inloggningen med hyperlänken är synlig.


publik asynkron Uppgift StartAsynk (CancellationToken cancellationToken)
        {
            HostingEventSource.Log.HostStart();

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

                    Foreach (VAR-värde i URL:er. Split('; ', StringSplitOptions.RemoveEmptyEntries))
                    {
                        adresser. Add(värde);
                    }
                }
            }

            RequestDelegate? tillämpning = null;

            Försök
            {
                var configure = Options.ConfigureApplication;

                om (konfigurera == null)
                {
                    kasta ny InvalidOperationException($"Ingen applikation konfigurerad. Vänligen ange en applikation via IWebHostBuilder.UseStartup, IWebHostBuilder.Configure, eller ange startassembler via {nameof(WebHostDefaults.StartupAssemblyKey)} i webbhotellkonfiguration.");
                }

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

                foreach (var filter i StartupFilters.Reverse())
                {
                    konfigurera = filter. Konfigurera (konfigurera);
                }

                konfigurera (byggare);

                Bygg förfrågningspipelinen
                Applikation = byggare. Build();
            }
            catch (Undantag t.ex.)
            {
                Logger.ApplicationError(ex);

                om (! Options.WebHostOptions.CaptureStartupErrors)
                {
                    kasta;
                }

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

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

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

            await Server.StartAsync(httpApplication, cancellationToken);

            om (adresser != null)
            {
                foreach (var-adress i adresser)
                {
                    LifetimeLogger.ListeningOnAddress(adress);
                }
            }

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

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


var webhostBuilder = ny GenericWebHostBuilder(builder, webHostBuilderOptions);
Inloggningen med hyperlänken är synlig.

WebHostBuilderExtensions-metoden

Tillhandahåller ett startupType-objekt för IWebHostBuilder-anrop.

denna IWebHostBuilder hostBuilder
if (hostBuilder är ISupportsStartup stödjerStartup)
{
    return supportsStartup.UseStartup(startupType);
}
Inloggningen med hyperlänken är synlig.

GenericWebHostBuilder Privat metod GenericWebHostBuilder

Instansisera vårt Startobjekt dynamiskt:

Instans?? = ActivatorUtilities.CreateInstance (ny HostServiceProvider(webHostBuilderContext), startupType);
Kontext. Properties[_startupKey] = instans;
Leta efter metoden ConfigureServices.

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

intern statisk ConfigureServicesBuilder FindConfigureServicesDelegate([DynamicallyAccessedMembers(StartupLinkerOptions.Accessibility)] Skriv startupType, sträng miljöNamn)
        {
            var servicesMethod = FindMethod(startupType, "Configure{0}Services", environmentName, typeof(IServiceProvider), required: false)
                ?? FindMethod(startupType, "Configure{0}Services", environmentName, typeof(void), krävs: false);
            returnera nya ConfigureServicesBuilder(servicesMethod);
Leta efter metoden ConfigureContainer.

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

intern statisk ConfigureContainerBuilder FindConfigureContainerDelegate([DynamicallyAccessedMembers(StartupLinkerOptions.Accessibility)] Typ startupType, sträng miljöNamn)
        {
            var configureMethod = FindMethod(startupType, "Configure{0}Container", environmentName, typeof(void), required: false);
            returnera nya ConfigureContainerBuilder(configureMethod);
        }
Leta efter Configure metoden

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

intern statisk ConfigureBuilder HittaConfigureDelegate([DynamicallyAccessedMembers(StartupLinkerOptions.Accessibility)] Skriv startupType, strängmiljöNamn)
{
    var configureMethod = FindMethod(startupType, "Configure{0}", environmentName, typeof(void), krävs: true)!;
    returnera ny ConfigureBuilder(configureMethod);
}
Källkoden, kallad av ConfigureBuilders Build-metod, är följande:

privatklass ConfigureBuilder
        {
            public ConfigureBuilder(MethodInfo configure)
            {
                MethodInfo = konfigurera;
            }

            public MethodInfo MethodInfo { get; }

            publik<IApplicationBuilder> Handlingsbyggande (objektinstans)
            {
                return (applicationBuilder) => Invoke (instans, applicationBuilder);
            }

            privat void Invoke (objektinstans, IApplicationBuilder builder)
            {
                var serviceProvider = builder. Applikationstjänster;
                var parameterInfos = MethodInfo.GetParameters();
                var-parametrar = nytt objekt[parameterInfos.Length];
                för (var-index = 0; index < parameterInfos.Length; index++)
                {
                    var parameterInfo = parameterInfos[index];
                    om (parameterInfo.ParameterType == typeof(IApplicationBuilder))
                    {
                        parametrar[index] = byggare;
                    }
                    annars
                    {
                        Försök
                        {
                            parameters[index] = serviceProvider.GetRequiredService(parameterInfo.ParameterType);
                        }
                        catch (Undantag t.ex.)
                        {
                            kasta ny InvalidOperationException(
                                Resources.FormatMiddlewareFilter_ServiceResolutionFail(
                                    parameterInfo.ParameterType.FullName,
                                    parameterInfo.Name,
                                    MethodInfo.Name,
                                    MethodInfo.DeclaringType.FullName),
                                ex);
                        }
                    }
                }
                MethodInfo.Invoke(instans, parametrar);
            }
        }
Körmetod

Adress för HostingAbstractionsHostExtensions extension-metod:

Inloggningen med hyperlänken är synlig.


Till slut ringer:

/// <summary>
        Kör en applikation och returnerar en Task som bara slutförs när token triggas eller avstängning aktiveras.
        /// </summary>
        <param name="host"><See cref="IHost"/> att köra.</param>
        <param name="token">Token som utlöser avstängning.</param>
        <returns><se cref="Uppgift"/> som representerar den asynkrona operationen.</returns>
        publik statisk asynkron Task RunAsync (denna IHost-värd, CancellationToken token = standard)
        {
            Försök
            {
                Vänta på värden. StartAsync(token). ConfigureAwait (falsk);

                Vänta på värden. VäntaPåStängAsynk (token). ConfigureAwait (falsk);
            }
            Äntligen
            {
                if (värd är IAsyncDisposable asyncDisposable)
                {
                    await asyncDisposable.DisposeAsync(). ConfigureAwait (falsk);
                }
                annars
                {
                    värd. Göra sig av med();
                }

            }
        }
Tidigare, när jag byggde en tjänst, registrerade jag mig för IHost-tjänsten, och koden är följande:

tjänster. AddSingleton<IHost>(_ =>
            {
                returnera ny intern. Värd(_appServices,
                    _appServices.GetRequiredService<IHostApplicationLifetime>(),
                    _appServices.GetRequiredService<ILogger<Internal.Host>>(),
                    _appServices.GetRequiredService<IHostLifetime>(),
                    _appServices.GetRequiredService<IOptions<HostOptions>>());
            });
StartAsync-metoden

Adress:Inloggningen med hyperlänken är synlig.

publik asynkron Uppgift StartAsynk (CancelToken cancellationToken = standard)
        {
            _logger. Start();

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

            vänta _hostLifetime.WaitForStartAsync(combinedCancellationToken). ConfigureAwait (falsk);

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

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

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

            Eld IHostApplikationLifetime.Startad
            _applicationLifetime. NotifyStart();

            _logger. Startade();
        }
(Slut)




Föregående:Sen nykomling rapporterar
Nästa:.NET Core-fel i Linux Failure-behandlingsapplikationspaket
Publicerad den 2021-9-22 20:45:12 |
Lär dig att lära dig...
Friskrivning:
All programvara, programmeringsmaterial eller artiklar som publiceras av Code Farmer Network är endast för lärande- och forskningsändamål; Ovanstående innehåll får inte användas för kommersiella eller olagliga ändamål, annars kommer användarna att bära alla konsekvenser. Informationen på denna sida kommer från internet, och upphovsrättstvister har inget med denna sida att göra. Du måste helt radera ovanstående innehåll från din dator inom 24 timmar efter nedladdning. Om du gillar programmet, vänligen stöd äkta programvara, köp registrering och få bättre äkta tjänster. Om det finns något intrång, vänligen kontakta oss via e-post.

Mail To:help@itsvse.com