Tutoriel : Utiliser des indicateurs de fonctionnalités dans une application ASP.NET Core
Important
Ce document a été remplacé par le document de référence Gestion des fonctionnalités .NET, qui fournit la liste complète la plus actuelle et la plus détaillée des fonctionnalités disponibles dans les bibliothèques de gestion des fonctionnalités .NET.
Pour commencer à utiliser des indicateurs de fonctionnalités dans vos applications, suivez les guides de démarrage rapide pour les applications console .NET ou pour les applications ASP.NET Core.
Les bibliothèques de gestion des fonctionnalités .NET fournissent une prise en charge idiomatique pour implémenter des indicateurs de fonctionnalités dans une application .NET ou ASP.NET Core. Ces bibliothèques vous permettent d’ajouter de façon déclarative des indicateurs de fonctionnalités à votre code afin de vous éviter d’écrire manuellement le code nécessaire pour activer ou désactiver des fonctionnalités avec des instructions if
.
Les bibliothèques de gestion des fonctionnalités gèrent également les cycles de vie des indicateurs de fonctionnalités en arrière-plan. Par exemple, elles actualisent et mettent en cache l’état des indicateurs ou garantissent qu’un état d’indicateur est immuable pendant un appel de demande. De plus, la bibliothèque ASP.NET Core offre des intégrations prêtes à l’emploi, notamment des intergiciels (middleware), des routes, des vues et des actions de contrôleur MVC.
Dans ce didacticiel, vous apprendrez à :
- Ajouter des indicateurs de fonctionnalités dans des parties clés de votre application afin de contrôler la disponibilité des fonctionnalités
- Effectuer une intégration à App Configuration quand vous l’utilisez pour gérer les indicateurs de fonctionnalités.
Prérequis
- Le guide de démarrage rapide Ajouter des indicateurs de fonctionnalités à une application ASP.NET Core montre un exemple simple d’utilisation d’indicateurs de fonctionnalités dans une application ASP.NET Core. Ce tutoriel présente d’autres fonctionnalités et options de configuration des bibliothèques de gestion des fonctionnalités. Vous pouvez utiliser l’exemple d’application créé dans le guide de démarrage rapide pour essayer l’exemple de code présenté dans ce tutoriel.
Configurer la gestion des fonctionnalités
Pour accéder au gestionnaire de fonctionnalités .NET, votre application doit avoir des références aux packages NuGet Microsoft.Azure.AppConfiguration.AspNetCore
et Microsoft.FeatureManagement.AspNetCore
.
Le gestionnaire de fonctionnalités .NET est configuré depuis le système de configuration natif de l’infrastructure. Vous pouvez donc définir les paramètres des indicateurs de fonctionnalités de votre application à l’aide de n’importe quelle source de configuration prise en charge par .NET, notamment le fichier appsettings.json
local ou des variables d’environnement.
Par défaut, le gestionnaire de fonctionnalités récupère la configuration de l’indicateur de fonctionnalité à partir de la section "FeatureManagement"
des données de configuration .NET. Pour utiliser l’emplacement de configuration par défaut, appelez la méthode AddFeatureManagement de l’interface IServiceCollection passée dans la méthode ConfigureServices de la classe Startup.
using Microsoft.FeatureManagement;
builder.Services.AddFeatureManagement();
Vous pouvez spécifier que la configuration de la gestion des fonctionnalités doit être récupérée à partir d’une section de configuration différente en appelant Configuration.GetSection et en passant le nom de la section souhaitée. L’exemple suivant fait en sorte qu’il lise à partir d’une autre section nommée "MyFeatureFlags"
à la place :
using Microsoft.FeatureManagement;
builder.Services.AddFeatureManagement(Configuration.GetSection("MyFeatureFlags"));
Vous pouvez utiliser des filtres de fonctionnalités pour activer les indicateurs de fonctionnalité conditionnels. Pour utiliser des filtres de fonctionnalités intégrés ou créer vos propres filtres, consultez Activer les fonctionnalités conditionnelles avec des filtres de fonctionnalités.
Plutôt que de coder en dur vos indicateurs de fonctionnalités dans votre application, nous vous recommandons de conserver les indicateurs de fonctionnalités en dehors de l’application et de les gérer séparément. Cela vous permet de modifier l’état des indicateurs à tout moment, et d’appliquer immédiatement ces changements dans l’application. Le service Azure App Configuration fournit une interface utilisateur de portail dédiée pour la gestion de tous les indicateurs de fonctionnalités. Le service Azure App Configuration remet également les indicateurs de fonctionnalités à votre application directement par le biais de ses bibliothèques de client .NET Core.
Le moyen le plus simple de connecter votre application ASP.NET Core à App Configuration est de passer par le fournisseur de configuration inclus dans le package NuGet Microsoft.Azure.AppConfiguration.AspNetCore
. Après avoir inclus une référence au package, effectuez les étapes suivantes pour utiliser ce package NuGet.
Ouvrez le fichier Program.cs et ajoutez le code suivant.
using Microsoft.Extensions.Configuration.AzureAppConfiguration; var builder = WebApplication.CreateBuilder(args); builder.Configuration.AddAzureAppConfiguration(options => options.Connect( builder.Configuration["ConnectionStrings:AppConfig"]) .UseFeatureFlags());
Mettez à jour les configurations d’intergiciel et de service de votre application à l’aide du code suivant.
Dans la classe
program.cs
, inscrivez les services Azure App Configuration et l’intergiciel sur les objetsbuilder
etapp
:builder.Services.AddAzureAppConfiguration(); app.UseAzureAppConfiguration();
Dans un scénario classique, vous mettrez régulièrement à jour les valeurs de vos indicateurs de fonctionnalités à mesure que vous déployez et activez les différentes fonctionnalités de votre application. Par défaut, les valeurs d’indicateur de fonctionnalité sont mises en cache pendant une période de 30 secondes. Une opération d’actualisation déclenchée quand le middleware reçoit une demande ne met donc à jour la valeur qu’après l’expiration de la valeur mise en cache. Le code suivant montre comment faire passer l’heure d’expiration du cache ou l’intervalle d’interrogation à 5 minutes en affectant UseFeatureFlags à CacheExpirationInterval dans l’appel.
config.AddAzureAppConfiguration(options =>
options.Connect(
builder.Configuration["ConnectionStrings:AppConfig"])
.UseFeatureFlags(featureFlagOptions => {
featureFlagOptions.CacheExpirationInterval = TimeSpan.FromMinutes(5);
}));
Déclaration d’indicateur de fonctionnalité
Chaque déclaration d’indicateur de fonctionnalité comporte deux parties : un nom et une liste d’un ou plusieurs filtres qui servent à évaluer si l’état d’une fonctionnalité est on (autrement dit, quand sa valeur est True
). Un filtre définit un critère pour le moment où une fonctionnalité doit être activée.
Si un indicateur de fonctionnalité a plusieurs filtres, la liste des filtres est parcourue dans l’ordre jusqu’à ce que l’un d’eux détermine que la fonctionnalité doit être activée. À ce stade, l’indicateur de fonctionnalité est on (activée) et les résultats du filtrage restants sont ignorés. Si aucun filtre n’indique que la fonctionnalité doit être activée, l’indicateur de fonctionnalité est off (désactivée).
Le gestionnaire de fonctionnalités prend en charge appsettings.json comme source de configuration pour les indicateurs de fonctionnalités. L’exemple suivant montre comment configurer des indicateurs de fonctionnalités dans un fichier JSON :
{
"FeatureManagement": {
"FeatureA": true, // Feature flag set to on
"FeatureB": false, // Feature flag set to off
"FeatureC": {
"EnabledFor": [
{
"Name": "Percentage",
"Parameters": {
"Value": 50
}
}
]
}
}
}
Par convention, la section FeatureManagement
de ce document JSON est utilisée pour les paramètres des indicateurs de fonctionnalités. L’exemple précédent montre trois indicateurs de fonctionnalités avec leurs filtres définis dans la propriété EnabledFor
:
FeatureA
est défini sur on.FeatureB
est défini sur off.FeatureC
spécifie un filtre nomméPercentage
avec une propriétéParameters
.Percentage
est un filtre configurable. Dans cet exemple,Percentage
spécifie une probabilité de 50 % que l’indicateurFeatureC
soit défini sur on. Pour obtenir un guide pratique sur l’utilisation des filtres de fonctionnalités, consultez Utiliser des filtres de fonctionnalités pour activer les indicateurs de fonctionnalités conditionnels.
Utiliser l’injection de dépendances pour accéder à IFeatureManager
Pour certaines opérations, telles que la vérification manuelle des valeurs d’indicateurs de fonctionnalités, vous devez obtenir une instance de IFeatureManager. Dans ASP.NET Core MVC, vous pouvez accéder au gestionnaire de fonctionnalités IFeatureManager
par le biais de l’injection de dépendances. Dans l’exemple suivant, un argument de type IFeatureManager
est ajouté à la signature du constructeur d’un contrôleur. Le runtime résout automatiquement la référence, puis fournit une implémentation de l’interface lors de l’appel du constructeur. Si vous utilisez un modèle d’application dans lequel le contrôleur a déjà un ou plusieurs arguments d’injection de dépendances dans le constructeur, par exemple ILogger
, vous pouvez simplement ajouter IFeatureManager
comme argument supplémentaire :
using Microsoft.FeatureManagement;
public class HomeController : Controller
{
private readonly IFeatureManager _featureManager;
public HomeController(ILogger<HomeController> logger, IFeatureManager featureManager)
{
_featureManager = featureManager;
}
}
Références des indicateurs de fonctionnalités
Définissez les indicateurs de fonctionnalités en tant que variables de chaîne pour les référencer à partir du code :
public static class MyFeatureFlags
{
public const string FeatureA = "FeatureA";
public const string FeatureB = "FeatureB";
public const string FeatureC = "FeatureC";
}
Vérifications des indicateurs de fonctionnalités
Le modèle de gestion des fonctionnalités courant consiste à vérifier si un indicateur de fonctionnalité est défini sur on et, le cas échéant, à exécuter une section de code. Par exemple :
IFeatureManager featureManager;
...
if (await featureManager.IsEnabledAsync(MyFeatureFlags.FeatureA))
{
// Run the following code
}
Actions de contrôleur
Avec les contrôleurs MVC, vous pouvez utiliser l’attribut FeatureGate
pour déterminer si l’ensemble d’une classe de contrôleur ou une action spécifique est activée. Le contrôleur HomeController
suivant exige que FeatureA
soit défini sur on avant l’exécution de toute action que contient la classe de contrôleur :
using Microsoft.FeatureManagement.Mvc;
[FeatureGate(MyFeatureFlags.FeatureA)]
public class HomeController : Controller
{
...
}
L’action Index
suivante exige que FeatureA
soit défini sur on pour pouvoir être exécutée :
using Microsoft.FeatureManagement.Mvc;
[FeatureGate(MyFeatureFlags.FeatureA)]
public IActionResult Index()
{
return View();
}
Quand une action ou un contrôleur MVC est bloqué car l’indicateur de fonctionnalité de contrôle est défini sur off, une interface IDisabledFeaturesHandler inscrite est appelée. L’interface IDisabledFeaturesHandler
par défaut retourne un code d’état 404 au client sans corps de réponse.
Vues MVC
Ouvrez _ViewImports.cshtml dans le répertoire Views, puis ajoutez le tag helper du gestionnaire de fonctionnalités :
@addTagHelper *, Microsoft.FeatureManagement.AspNetCore
Dans les vues MVC, vous pouvez utiliser une balise <feature>
pour restituer le contenu si un indicateur de fonctionnalité est activé :
<feature name="FeatureA">
<p>This can only be seen if 'FeatureA' is enabled.</p>
</feature>
Pour afficher un contenu alternatif quand les conditions requises ne sont pas remplies, l’attribut negate
peut être utilisé.
<feature name="FeatureA" negate="true">
<p>This will be shown if 'FeatureA' is disabled.</p>
</feature>
La balise de fonctionnalité <feature>
peut également être utilisée pour afficher le contenu si certaines ou l’ensemble des fonctionnalités dans une liste sont activées.
<feature name="FeatureA, FeatureB" requirement="All">
<p>This can only be seen if 'FeatureA' and 'FeatureB' are enabled.</p>
</feature>
<feature name="FeatureA, FeatureB" requirement="Any">
<p>This can be seen if 'FeatureA', 'FeatureB', or both are enabled.</p>
</feature>
Filtres MVC
Vous pouvez configurer des filtres MVC de sorte que leur activation soit basée sur l’état d’un indicateur de fonctionnalité. Cette fonctionnalité est limitée aux filtres qui implémentent IAsyncActionFilter. Le code suivant ajoute un filtre MVC nommé ThirdPartyActionFilter
. Ce filtre est déclenché dans le pipeline MVC seulement si FeatureA
est activé.
using Microsoft.FeatureManagement.FeatureFilters;
IConfiguration Configuration { get; set;}
public void ConfigureServices(IServiceCollection services)
{
services.AddMvc(options => {
options.Filters.AddForFeature<ThirdPartyActionFilter>(MyFeatureFlags.FeatureA);
});
}
Middlewares
Vous pouvez également utiliser des indicateurs de fonctionnalités pour ajouter de manière conditionnelle des intergiciels (middlewares) et des branches d’application. Le code suivant insère un composant d’intergiciel dans le pipeline de requête uniquement quand FeatureA
est activé :
app.UseMiddlewareForFeature<ThirdPartyMiddleware>(MyFeatureFlags.FeatureA);
Ce code repose sur la capacité plus générique qui consiste à créer une branche de l’ensemble de l’application entière en fonction d’un indicateur de fonctionnalité :
app.UseForFeature(featureName, appBuilder => {
appBuilder.UseMiddleware<T>();
});
Étapes suivantes
Dans ce tutoriel, vous avez découvert comment implémenter des indicateurs de fonctionnalités dans votre application ASP.NET Core en utilisant les bibliothèques Microsoft.FeatureManagement
. Pour plus d’informations sur la prise en charge de la gestion des fonctionnalités dans ASP.NET Core et App Configuration, consultez les ressources suivantes :