Observação
O acesso a essa página exige autorização. Você pode tentar entrar ou alterar diretórios.
O acesso a essa página exige autorização. Você pode tentar alterar os diretórios.
Dica
Esse conteúdo é um trecho do eBook, arquitetura de microsserviços do .NET para aplicativos .NET em contêineres, disponível em do .NET Docs ou como um PDF para download gratuito que pode ser lido offline.
Enumerações (ou tipos de enumeração) são um wrapper de idioma fino em torno de um tipo integral. Talvez você queira limitar seu uso ao armazenar um valor de um conjunto fechado de valores. A classificação com base em tamanhos (pequeno, médio, grande) é um bom exemplo. Usar enumerações para fluxo de controle ou abstrações mais robustas pode ser um code smell. Esse tipo de uso leva a um código frágil com muitas instruções de fluxo de controle verificando valores da enumeração.
Em vez disso, você pode criar classes de Enumeração que habilitam todos os recursos avançados de uma linguagem orientada a objetos.
No entanto, este não é um tópico crítico e, em muitos casos, para simplificar, você ainda pode usar tipos de enumeração regulares se essa for a sua preferência. O uso de classes de enumeração está mais relacionado aos conceitos relacionados aos negócios.
Implementar uma classe base de enumeração
O microsserviço de ordenação no eShopOnContainers fornece uma implementação de classe base de enumeração de exemplo, conforme mostrado no exemplo a seguir:
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 ...
}
Você pode usar essa classe como um tipo em qualquer entidade ou objeto de valor, como para o seguinte CardType
: Enumeration
classe:
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)
{
}
}
Recursos adicionais
Jimmy Bogard. Classes de enumeração
https://lostechies.com/jimmybogard/2008/08/12/enumeration-classes/Steve Smith. Alternativas para enumerações em C#
https://ardalis.com/enum-alternatives-in-cEnumeration.cs. Classe base de enumeração no eShopOnContainers
https://github.com/dotnet-architecture/eShopOnContainers/blob/dev/src/Services/Ordering/Ordering.Domain/SeedWork/Enumeration.csCardType.cs. Exemplo de classe de enumeração no eShopOnContainers.
https://github.com/dotnet-architecture/eShopOnContainers/blob/dev/src/Services/Ordering/Ordering.Domain/AggregatesModel/BuyerAggregate/CardType.csSmartEnum. Ardalis – Classes para ajudar a produzir enumerações fortemente tipadas mais inteligentes no .NET.
https://www.nuget.org/packages/Ardalis.SmartEnum/