Automatisk aktivering av beroendeinmatning

📦 Microsoft.Extensions.DependencyInjection.AutoActivation NuGet-paketet innehåller funktioner för att automatiskt aktivera singleton-tjänster vid programstart i stället för att vänta på deras första användning. Den här metoden kan hjälpa till att minimera svarstiden för inledande begäranden genom att se till att tjänsterna är redo att hantera begäranden omedelbart när programmet startar.

När du ska använda automatisk aktivering

Automatisk aktivering är fördelaktigt i scenarier där:

  • Du vill minimera svarstiden för den första begäran genom att undvika kostnaderna för lat initiering.
  • Tjänster måste utföra initieringsarbete vid start, till exempel att värma upp cacheminnen eller upprätta anslutningar.
  • Du vill ha konsekventa svarstider redan från starten av applikationens livslängd.
  • Tjänster har dyra konstruktorer som du vill köra under start i stället för under bearbetning av begäranden.

Kom igång

För att komma igång med automatisk aktivering installerar du NuGet-paketet Microsoft.Extensions.DependencyInjection.AutoActivation.

dotnet add package Microsoft.Extensions.DependencyInjection.AutoActivation

Mer information finns i dotnet add package or Hantera paketberoenden i .NET program.

Registrera tjänster för automatisk aktivering

Paketet för automatisk aktivering innehåller tilläggsmetoder för att registrera tjänster som aktiveras automatiskt när tjänstleverantören skapas. Det finns flera sätt att registrera tjänster för automatisk aktivering:

AddActivatedSingleton

Metoden AddActivatedSingleton registrerar en tjänst som en singleton och ser till att den aktiveras vid start:

using Microsoft.Extensions.DependencyInjection;

var services = new ServiceCollection();

services.AddActivatedSingleton<MyService>();

ServiceProvider provider = services.BuildServiceProvider();

I det här exemplet MyService instansieras när BuildServiceProvider() anropas, inte när det först begärs från tjänstleverantören.

ActivateSingleton

Metoden ActivateSingleton markerar en redan registrerad singleton-tjänst för aktivering vid start:

using Microsoft.Extensions.DependencyInjection;

var services = new ServiceCollection();

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

ServiceProvider provider = services.BuildServiceProvider();

Den här metoden är användbar när du har befintliga tjänstregistreringar som du vill aktivera vid start utan att ändra registreringskoden.

TryAddActivatedSingleton

Metoden TryAddActivatedSingleton registrerar villkorligt en tjänst för automatisk aktivering endast om den inte redan har registrerats:

using Microsoft.Extensions.DependencyInjection;

var services = new ServiceCollection();

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

ServiceProvider provider = services.BuildServiceProvider();

Den här metoden följer samma mönster som andra TryAdd* metoder i beroendeinmatningsramverket, vilket säkerställer att tjänsterna bara registreras en gång.

Fullständigt exempel

Här är ett fullständigt exempel som visar hur du använder automatisk aktivering i ett konsolprogram:

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!");
    }
}

När det här programmet startar visas meddelandena från CacheWarmer konstruktorn som skrivs ut innan programmet börjar bearbeta begäranden, vilket bekräftar att tjänsten aktiverades vid start.

Automatisk aktivering med beroenden

Automatiskt aktiverade tjänster kan vara beroende av andra tjänster via beroendeinmatning:

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.");
    }
}

I det här exemplet beror tjänsten StartupTaskRunnerILogger<StartupTaskRunner>, som automatiskt tillhandahålls av containern för beroendeinmatning.

Bästa praxis

När du använder automatisk aktivering bör du överväga följande metodtips:

  • Endast för singletons: Automatisk aktivering är utformad för singleton-tjänster. Tjänster med kortare livslängd (begränsade eller tillfälliga) bör inte aktiveras automatiskt.
  • Håll starten snabb: Automatiskt aktiverade tjänster bör slutföra sin initiering snabbt för att undvika att fördröja programstarten. Överväg att använda bakgrundstjänster eller värdbaserade tjänster för längre initiering.
  • Hantera fel på ett korrekt sätt: Undantag som utlöses under byggandet av automatiskt aktiverade tjänster hindrar programmet från att starta. Se till att robust felhantering finns i tjänstkonstruktorer.
  • Överväg värdbaserade tjänster: För tjänster som behöver utföra pågående arbete eller asynkron initiering bör du överväga att använda IHostedService i stället för automatisk aktivering.

Se även