Notes
L’accès à cette page nécessite une autorisation. Vous pouvez essayer de vous connecter ou de modifier des répertoires.
L’accès à cette page nécessite une autorisation. Vous pouvez essayer de modifier des répertoires.
Conseil / Astuce
Ce contenu est un extrait du livre électronique 'Architecture des microservices .NET pour les applications .NET conteneurisées', disponible sur .NET Docs ou en tant que PDF téléchargeable gratuitement, lisible hors ligne.
Les énumérations (ou types d’énumération pour faire court) sont une enveloppe légère de langage autour d’un type intégral. Vous pouvez limiter leur utilisation lorsque vous stockez une valeur à partir d’un ensemble de valeurs fermé. La classification basée sur les tailles (petite, moyenne, grande) est un bon exemple. L’utilisation d’énumérations pour le flux de contrôle ou des abstractions plus robustes peut être une odeur de code. Ce type d’utilisation entraîne un code fragile avec de nombreuses instructions de flux de contrôle vérifiant les valeurs de l’énumération.
Au lieu de cela, vous pouvez créer des classes d’énumération qui activent toutes les fonctionnalités enrichies d’un langage orienté objet.
Toutefois, ce n’est pas une rubrique critique et, dans de nombreux cas, par souci de simplicité, vous pouvez toujours utiliser des types d’énumération standard si c’est votre préférence. L’utilisation de classes d’énumération est plus liée aux concepts liés à l’entreprise.
Implémenter une classe de base d’énumération
Le microservice de classement dans eShopOnContainers fournit un exemple d’implémentation de classe de base d’énumération, comme illustré dans l’exemple suivant :
public abstract class Enumeration : IComparable
{
public string Name { get; private set; }
public int Id { get; private set; }
protected Enumeration(int id, string name) => (Id, Name) = (id, name);
public override string ToString() => Name;
public static IEnumerable<T> GetAll<T>() where T : Enumeration =>
typeof(T).GetFields(BindingFlags.Public |
BindingFlags.Static |
BindingFlags.DeclaredOnly)
.Select(f => f.GetValue(null))
.Cast<T>();
public override bool Equals(object obj)
{
if (obj is not Enumeration otherValue)
{
return false;
}
var typeMatches = GetType().Equals(obj.GetType());
var valueMatches = Id.Equals(otherValue.Id);
return typeMatches && valueMatches;
}
public int CompareTo(object other) => Id.CompareTo(((Enumeration)other).Id);
// Other utility methods ...
}
Vous pouvez utiliser cette classe comme type dans n’importe quel objet entité ou valeur, comme pour la classe suivante CardType
: Enumeration
public class CardType
: Enumeration
{
public static CardType Amex = new(1, nameof(Amex));
public static CardType Visa = new(2, nameof(Visa));
public static CardType MasterCard = new(3, nameof(MasterCard));
public CardType(int id, string name)
: base(id, name)
{
}
}
Ressources supplémentaires
Jimmy Bogard. Classes d’énumération
https://lostechies.com/jimmybogard/2008/08/12/enumeration-classes/Steve Smith. Alternatives d’énumération en C#
https://ardalis.com/enum-alternatives-in-cEnumeration.cs. Classe d’énumération de base dans eShopOnContainers
https://github.com/dotnet-architecture/eShopOnContainers/blob/dev/src/Services/Ordering/Ordering.Domain/SeedWork/Enumeration.csCardType.cs. Exemple de classe d’énumération dans eShopOnContainers.
https://github.com/dotnet-architecture/eShopOnContainers/blob/dev/src/Services/Ordering/Ordering.Domain/AggregatesModel/BuyerAggregate/CardType.csSmartEnum. Ardalis - Classes pour faciliter la création d'énumérations fortement typées et plus avancées dans .NET.
https://www.nuget.org/packages/Ardalis.SmartEnum/