Avvio rapido: aggiungere flag di funzionalità a un servizio in background .NET

In questa guida introduttiva si integra la funzionalità di gestione delle funzionalità di Configurazione app di Azure in un servizio in background .NET. Si usa Configurazione app per archiviare e gestire centralmente i flag di funzionalità.

Prerequisiti

Il supporto per la gestione delle funzionalità estende la funzionalità di configurazione dinamica in Configurazione app. L’esempio di questa guida rapida si basa sull’app .NET di servizio in background presentata nell’esercitazione sulla configurazione dinamica. Prima di continuare, completare l’esercitazione seguente per creare prima un’app del servizio in background .NET con configurazione dinamica.

Aggiungere un flag per funzionalità

Aggiungere un flag di funzionalità chiamato Beta all’archivio di Configurazione app e lasciare Etichetta e Descrizione con i relativi valori predefiniti. Per altre informazioni su come aggiungere flag di funzionalità a un archivio tramite il portale di Azure o l’interfaccia della riga di comando (CLI), vai a Creare un flag di funzionalità.

Screenshot che mostra i campi per abilitare un flag di funzionalità chiamato Beta.

Usa il flag di funzionalità

  1. Aggiungere riferimenti al pacchetto NuGet Microsoft.FeatureManagement eseguendo il comando seguente:

    dotnet add package Microsoft.FeatureManagement
    
  2. Eseguire il comando seguente per ripristinare i pacchetti per il progetto:

    dotnet restore
    
  3. Aprire Program.cs e aggiungere l’istruzione seguente:

    using Microsoft.FeatureManagement;
    
  4. Aggiungere una chiamata al metodo UseFeatureFlags all’interno della chiamata AddAzureAppConfiguration e registrare i servizi di gestione delle funzionalità.

    // Existing code in Program.cs
    // ... ...
    builder.Configuration.AddAzureAppConfiguration(options =>
    {
        string endpoint = Environment.GetEnvironmentVariable("Endpoint"); 
        options.Connect(new Uri(endpoint), new DefaultAzureCredential());
    
        // Use feature flags
        options.UseFeatureFlags();
    
        // Register the refresher so that the Worker service can consume it through dependency injection
        builder.Services.AddSingleton(options.GetRefresher());
    });
    
    // Register feature management services
    builder.Services.AddFeatureManagement();
    
    // The rest of existing code in Program.cs
    // ... ...
    

    Suggerimento

    Quando non viene passato alcun parametro al metodo UseFeatureFlags, questo carica tutti i flag di funzionalità con nessuna etichetta nell’archivio di Configurazione app. L’intervallo di aggiornamento predefinito dei flag di funzionalità è di 30 secondi. È possibile personalizzare questo comportamento tramite il parametro FeatureFlagOptions. Ad esempio, il frammento di codice seguente carica solo i flag di funzionalità che iniziano con TestApp: nel nome della chiave e hanno l’etichetta dev. Il codice modifica anche il tempo dell’intervallo di aggiornamento a 5 minuti. Si noti che questo intervallo di aggiornamento è distinto da quello delle normali coppie chiave-valore.

    options.UseFeatureFlags(featureFlagOptions =>
    {
        featureFlagOptions.Select("TestApp:*", "dev");
        featureFlagOptions.CacheExpirationInterval = TimeSpan.FromMinutes(5);
    });
    
  5. Aprire Worker.cs e aggiungere l’istruzione seguente:

    using Microsoft.FeatureManagement;
    
  6. Aggiornare il costruttore del servizio Worker per ottenere istanze di IConfigurationRefresher e IVariantFeatureManager tramite inserimento delle dipendenze.

    public class Worker : BackgroundService
    {
        private readonly ILogger<Worker> _logger;
        private readonly IConfigurationRefresher _refresher;
        private readonly IVariantFeatureManager _featureManager;
    
        public Worker(ILogger<Worker> logger, IConfigurationRefresher refresher, IVariantFeatureManager featureManager)
        {
            _logger = logger ?? throw new ArgumentNullException(nameof(logger));
            _refresher = refresher ?? throw new ArgumentNullException(nameof(refresher));
            _featureManager = featureManager ?? throw new ArgumentNullException(nameof(featureManager));
        }
    
        // ... ...
    }
    
  7. Aggiorna il metodo ExecuteAsync in modo da registrare un messaggio in base allo stato del flag della funzionalità.

    Il metodo TryRefreshAsync viene chiamato all’inizio di ogni iterazione dell’esecuzione dell’attività per aggiornare il flag di funzionalità. Non verrà eseguita alcuna operazione se non è ancora trascorso l’intervallo di aggiornamento. L’operatore await non viene usato in modo che i flag di funzionalità vengano aggiornati senza bloccare l’iterazione corrente dell’esecuzione dell'attività. In tal caso, le iterazioni successive dell’esecuzione dell’attività otterranno il valore aggiornato.

    protected override async Task ExecuteAsync(CancellationToken stoppingToken)
    {
        while (!stoppingToken.IsCancellationRequested)
        {
            // Intentionally not await TryRefreshAsync to avoid blocking the execution.
            _refresher.TryRefreshAsync(stoppingToken);
    
            if (_logger.IsEnabled(LogLevel.Information))
            {
                if (await _featureManager.IsEnabledAsync("Beta"))
                {
                    _logger.LogInformation("[{time}]: Worker is running with Beta feature.", DateTimeOffset.Now);
                }
                else
                {
                    _logger.LogInformation("[{time}]: Worker is running.", DateTimeOffset.Now);
                }
            }
    
            await Task.Delay(TimeSpan.FromSeconds(30), stoppingToken);
        }
    }
    

Compilare ed eseguire l'app in locale

  1. Eseguire il comando seguente per compilare l'app:

    dotnet build
    
  2. Al termine della compilazione, eseguire questo comando per eseguire l'app Web in locale:

    dotnet run
    
  3. Nella console dovrebbero essere visualizzati gli output seguenti.

    Schermata della console con il servizio in background in esecuzione con il flag della funzionalità disabilitato.

  4. Accedere al portale di Azure. Selezionare Tutte le risorse e selezionare l’archivio di Configurazione app creato in precedenza.

  5. Selezionare Gestione funzionalità e individuare il flag di funzionalità Beta. Abilitare il flag selezionando la casella di controllo in Abilitato.

  6. Attendere alcuni istanti finché non sia trascorsa la finestra temporale dell’intervallo di aggiornamento. Verrà visualizzato il messaggio di log aggiornato.

    Schermata della console con il servizio in background in esecuzione con il feature flag abilitato.

Pulire le risorse

Se non si vuole continuare a usare le risorse create in questo articolo, eliminare il gruppo di risorse creato qui per evitare addebiti.

Importante

L'eliminazione di un gruppo di risorse è irreversibile. Il gruppo di risorse e tutte le risorse in esso contenute vengono eliminati in modo permanente. Assicurarsi di non eliminare accidentalmente il gruppo di risorse o le risorse sbagliate. Se le risorse per questo articolo sono state create in un gruppo di risorse che contiene altre risorse che si vogliono mantenere, eliminare ogni risorsa singolarmente dal rispettivo riquadro anziché eliminare il gruppo di risorse.

  1. Accedere al portale di Azure e selezionare Gruppi di risorse.
  2. Nella casella Filtra per nome immettere il nome del gruppo di risorse.
  3. Nell'elenco dei risultati selezionare il nome del gruppo di risorse per visualizzare una panoramica.
  4. Selezionare Elimina gruppo di risorse.
  5. Verrà chiesto di confermare l'eliminazione del gruppo di risorse. Immettere il nome del gruppo di risorse per confermare e selezionare Elimina.

Dopo qualche istante, il gruppo di risorse e tutte le risorse che contiene vengono eliminati.

Passaggi successivi

In questa guida rapida, hai creato un flag di funzionalità e lo hai utilizzato con un servizio in background.

Per abilitare la funzionalità di gestione delle funzionalità per altri tipi di app, continuare con le esercitazioni seguenti.

Per altre informazioni sulla gestione dei flag di funzionalità in Configurazione app di Azure, continuare con l’esercitazione seguente.

Per il rundown completo della funzionalità della libreria di gestione delle funzionalità .NET, continuare con il documento seguente.