Delen via


Automatische activering van afhankelijkheidsinjectie

Het 📦 Microsoft.Extensions.DependencyInjection.AutoActivation NuGet-pakket biedt functionaliteit voor het automatisch activeren van singleton-services bij het opstarten van toepassingen, in plaats van te wachten op hun eerste gebruik. Deze aanpak kan helpen bij het minimaliseren van de latentie voor initiële aanvragen door ervoor te zorgen dat services direct klaar zijn om aanvragen te verwerken wanneer de toepassing wordt gestart.

Wanneer gebruikt u automatische activering

Automatische activering is nuttig in scenario's waarbij:

  • U wilt de latentie van de eerste aanvraag minimaliseren door de overhead van luie initialisatie te voorkomen.
  • Services moeten initialisatiewerkzaamheden uitvoeren bij het opstarten, zoals het opwarmen van caches of het tot stand brengen van verbindingen.
  • U wilt consistente reactietijden vanaf het begin van de levensduur van uw toepassing.
  • Services hebben dure constructors die u wilt uitvoeren tijdens het opstarten in plaats van tijdens het verwerken van aanvragen.

Aan de slag

Als u wilt beginnen met de automatische activering, installeert u het NuGet-pakket Microsoft.Extensions.DependencyInjection.AutoActivation.

dotnet add package Microsoft.Extensions.DependencyInjection.AutoActivation

Zie dotnet add package or Manage package dependencies in .NET applications voor meer informatie.

Services registreren voor automatische activering

Het pakket voor automatische activering biedt uitbreidingsmethoden voor het registreren van services die automatisch worden geactiveerd wanneer de serviceprovider wordt gebouwd. Er zijn verschillende manieren om services te registreren voor automatische activering:

AddActivatedSingleton

De AddActivatedSingleton methode registreert een service als een singleton en zorgt ervoor dat deze wordt geactiveerd bij het opstarten:

using Microsoft.Extensions.DependencyInjection;

var services = new ServiceCollection();

services.AddActivatedSingleton<MyService>();

ServiceProvider provider = services.BuildServiceProvider();

In dit voorbeeld wordt MyService geïnitieerd wanneer BuildServiceProvider() wordt aangeroepen, niet wanneer het voor het eerst bij de serviceprovider wordt aangevraagd.

ActivateSingleton

De ActivateSingleton methode markeert een reeds geregistreerde singleton-service voor activering bij het opstarten:

using Microsoft.Extensions.DependencyInjection;

var services = new ServiceCollection();

services.AddSingleton<MyService>();
services.ActivateSingleton<MyService>();

ServiceProvider provider = services.BuildServiceProvider();

Deze methode is handig wanneer u bestaande serviceregistraties hebt die u wilt activeren bij het opstarten zonder de registratiecode te wijzigen.

TryAddActivatedSingleton (activeerce Singleton toevoegen)

Met de TryAddActivatedSingleton methode wordt een service voorwaardelijk geregistreerd voor automatische activering als deze nog niet is geregistreerd:

using Microsoft.Extensions.DependencyInjection;

var services = new ServiceCollection();

services.TryAddActivatedSingleton<MyService>();
services.TryAddActivatedSingleton<MyService>(); // This has no effect

ServiceProvider provider = services.BuildServiceProvider();

Deze methode volgt hetzelfde patroon als andere TryAdd* methoden in het afhankelijkheidsinjectieframework, zodat services slechts eenmaal worden geregistreerd.

Volledig voorbeeld

Hier volgt een volledig voorbeeld van het gebruik van automatische activering in een consoletoepassing:

public class CacheWarmer
{
    public CacheWarmer()
    {
        Console.WriteLine("Warming up cache at startup...");
        // Perform expensive initialization
        WarmUpCache();
    }

    private void WarmUpCache()
    {
        // Cache warming logic here
        Console.WriteLine("Cache warmed up successfully!");
    }
}

Wanneer deze toepassing wordt gestart, ziet u de berichten van de CacheWarmer constructor die worden afgedrukt voordat de toepassing aanvragen verwerkt, wat bevestigt dat de service bij het opstarten is geactiveerd.

Automatische activering met afhankelijkheden

Automatisch geactiveerde services kunnen afhankelijk zijn van andere services via afhankelijkheidsinjectie:

public class StartupTaskRunner
{
    private readonly ILogger<StartupTaskRunner> _logger;

    public StartupTaskRunner(ILogger<StartupTaskRunner> logger)
    {
        _logger = logger;
        _logger.LogInformation("Running startup tasks...");
        RunTasks();
    }

    private void RunTasks()
    {
        // Execute startup tasks
        _logger.LogInformation("Startup tasks completed.");
    }
}

In dit voorbeeld is de StartupTaskRunner-service afhankelijk van ILogger<StartupTaskRunner>, die automatisch wordt geleverd door de afhankelijkheidsinjectie-container.

Goede praktijken

Houd bij het gebruik van automatische activering rekening met de volgende aanbevolen procedures:

  • Alleen voor singletons gebruiken: Automatische activering is ontworpen voor singleton-services. Services met een kortere levensduur (gescopeerd of tijdelijk) mogen niet automatisch geactiveerd worden.
  • Snel opstarten behouden: automatisch geactiveerde services moeten hun initialisatie snel voltooien om te voorkomen dat de applicatiestart wordt vertraagd. Overweeg het gebruik van achtergrondservices of gehoste services voor langere initialisatie.
  • Fouten probleemloos afhandelen: Uitzonderingen die zijn gegenereerd tijdens de bouw van automatisch geactiveerde services, verhinderen dat de toepassing wordt gestart. Zorg voor robuuste foutafhandeling in serviceconstructors.
  • Overweeg gehoste services: Voor services die doorlopend werk of asynchrone initialisatie moeten uitvoeren, kunt u overwegen in plaats van automatische activering te gebruiken IHostedService .

Zie ook