Sabit listesi türleri yerine numaralandırma sınıflarını kullanma
İpucu
Bu içerik, .NET Docs'ta veya çevrimdışı olarak okunabilen ücretsiz indirilebilir bir PDF olarak sağlanan Kapsayıcılı .NET Uygulamaları için .NET Mikro Hizmet Mimarisi e-Kitabı'ndan bir alıntıdır.
Numaralandırmalar (veya kısaca sabit listesi türleri ), tam sayı türü çevresinde ince bir dil sarmalayıcıdır. Kapalı bir değer kümesinden bir değer depolarken bunların kullanımını ile sınırlamak isteyebilirsiniz. Boyutlara göre sınıflandırma (küçük, orta, büyük) iyi bir örnektir. Denetim akışı veya daha güçlü soyutlamalar için sabit listeleri kullanmak bir kod kokusu olabilir. Bu kullanım türü, birçok denetim akışı deyiminin sabit listesi değerlerini denetlemesine sahip kırılgan kodlara yol açar.
Bunun yerine, nesne odaklı bir dilin tüm zengin özelliklerini etkinleştiren Numaralandırma sınıfları oluşturabilirsiniz.
Ancak bu kritik bir konu değildir ve çoğu durumda kolaylık sağlamak için tercihiniz buysa normal sabit listesi türlerini kullanmaya devam edebilirsiniz. Numaralandırma sınıflarının kullanımı daha çok işle ilgili kavramlar ile ilgilidir.
Numaralandırma temel sınıfı uygulama
eShopOnContainers'daki sipariş mikro hizmeti, aşağıdaki örnekte gösterildiği gibi örnek bir Numaralandırma temel sınıfı uygulaması sağlar:
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 ...
}
Bu sınıfı, aşağıdaki CardType
gibi herhangi bir varlık veya değer nesnesinde tür olarak kullanabilirsiniz: Enumeration
sınıfı:
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)
{
}
}
Ek kaynaklar
Jimmy Bogard. Numaralandırma sınıfları
https://lostechies.com/jimmybogard/2008/08/12/enumeration-classes/Steve Smith. C'de Sabit Listesi Alternatifleri#
https://ardalis.com/enum-alternatives-in-cEnumeration.cs. eShopOnContainers'da Temel Numaralandırma sınıfı
https://github.com/dotnet-architecture/eShopOnContainers/blob/dev/src/Services/Ordering/Ordering.Domain/SeedWork/Enumeration.csCardType.cs. eShopOnContainers'da Örnek Numaralandırma sınıfı.
https://github.com/dotnet-architecture/eShopOnContainers/blob/dev/src/Services/Ordering/Ordering.Domain/AggregatesModel/BuyerAggregate/CardType.csSmartEnum. Ardalis - .NET'te kesin olarak yazılan daha akıllı sabit listeleri üretmeye yardımcı olan sınıflar.
https://www.nuget.org/packages/Ardalis.SmartEnum/
Geri Bildirim
https://aka.ms/ContentUserFeedback.
Çok yakında: 2024 boyunca, içerik için geri bildirim mekanizması olarak GitHub Sorunları’nı kullanımdan kaldıracak ve yeni bir geri bildirim sistemiyle değiştireceğiz. Daha fazla bilgi için bkz.Gönderin ve geri bildirimi görüntüleyin