Sdílet prostřednictvím


Používejte třídy výčtu místo typů výčtu

Návod

Tento obsah je výňatek z eBooku, architektury mikroslužeb .NET pro kontejnerizované aplikace .NET, které jsou k dispozici na .NET Docs nebo jako zdarma ke stažení PDF, které lze číst offline.

eBook o architektuře mikroslužeb .NET pro kontejnerizované aplikace .NET, miniatura na obálce.

Výčty (nebo typy výčtu zkráceně) jsou tenkou jazykovou vrstvou kolem celočíselného typu. Při ukládání jedné hodnoty z uzavřené sady hodnot můžete chtít jejich použití omezit. Dobrým příkladem je klasifikace založená na velikostech (malá, střední, velká). Použití výčtů pro řízení toku nebo robustnější abstrakce může být kódový zápach. Tento typ použití vede k křehkému kódu s mnoha příkazy toku řízení, které kontrolují hodnoty výčtu.

Místo toho můžete vytvořit třídy výčtu, které umožňují všechny bohaté funkce objektově orientovaného jazyka.

Nejedná se ale o kritické téma a v mnoha případech pro jednoduchost můžete i nadále používat běžné typy výčtů , pokud je to vaše preference. Použití tříd výčtu souvisí s koncepty souvisejícími s obchodními činnostmi.

Implementujte základní třídu pro výčty

Mikroslužba objednávání v eShopOnContainers poskytuje ukázkovou implementaci základní třídy výčtu, jak je znázorněno v následujícím příkladu:

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 ...
}

Tuto třídu můžete použít jako typ v libovolném objektu entity nebo hodnoty, jako pro následující CardType : třída: 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)
    {
    }
}

Dodatečné zdroje