Not içeriği yükleniyor...
// Markdown dosyası okunuyor
// İçerik işleniyor
// Syntax highlighting hazırlanıyor
// Markdown dosyası okunuyor
// İçerik işleniyor
// Syntax highlighting hazırlanıyor
Domain Driven Design metodolojisinin temel prensipleri, strategic ve tactical patterns. Karmaşık iş problemlerini çözmek için domain odaklı yaklaşım rehberi.
Sektör / Uygulama | Domain Expert |
---|---|
E-ticaret | Pazarlama müdürü, stok yöneticisi |
Bankacılık | Kredi analisti, finans danışmanı |
Hastane otomasyonu | Doktor, hemşire, hasta kabul görevlisi |
Lojistik uygulaması | Nakliye planlayıcısı, depo yöneticisi |
İnsan kaynakları yazılımı | İK uzmanı, bordro sorumlusu |
bashpublic class Order { public Customer Customer { get; private set; } public List<OrderItem> Items { get; private set; } public OrderStatus Status { get; private set; } }
Bu tarz isimlendirmeler, kodun okunabilirliğini ve sürdürülebilirliğini tamamen ortadan kaldırır. İş birimi bu kodu asla okuyamaz, yazılımcı bile birkaç hafta sonra neyi ne için yazdığını unutabilir.bashpublic class Tbl_MainData { public string user_info; public string prod_type; public int stt; }
DbContext
, DbSet<T>
yapılarıyla doğrudan veriye erişebiliriz. Ancak iş karmaşıklaştığında ve uygulama büyüdüğünde, sadece Entity sınıflarına bağlı kalmak bazı sınırlamalara yol açar.Bu sınıfta sadece veriler var. Bu sınıf, bir veritabanı tablosunu temsil eder. Ama bu sınıfa bir iş kuralı (örneğin fiyat güncelleme) eklenmez.bashpublic class Product { public int Id { get; set; } public string Name { get; set; } public decimal Price { get; set; } }
Burada artık ürün sadece bir veri değil, kendi davranışına da sahip bir varlık (entity) haline geldi. Kurallar sınıfın içinde, dışarı sızmıyor.bashpublic class Product { public int Id { get; private set; } public string Name { get; private set; } public decimal Price { get; private set; } public Product(int id, string name, decimal price) { if (price < 0) throw new ArgumentException("Fiyat negatif olamaz."); Id = id; Name = name; Price = price; } public void UpdatePrice(decimal newPrice) { if (newPrice < 0) throw new ArgumentException("Yeni fiyat negatif olamaz."); Price = newPrice; } }
bashpublic class Order { public int Id { get; set; } public decimal TotalAmount { get; set; } public bool IsPaid { get; set; } }
IsPaid
doğrudan dışarıdan set edilebilir.public set
vardır, doğrudan erişilebilir.EF Core tarafından veritabanına veri okuma/yazma için kullanılır. İçerisinde hiçbir iş kuralı yoktur. Sadece veri taşıma (DTO gibi düşünebilirsin).Price
doğrudan değiştirilebilir.bashpublic class Order { public int Id { get; private set; } public decimal TotalAmount { get; private set; } public bool IsPaid { get; private set; } public Order(int id, decimal totalAmount) { if (totalAmount <= 0) throw new ArgumentException("Tutar sıfırdan büyük olmalı."); Id = id; TotalAmount = totalAmount; IsPaid = false; } public void MakePayment() { if (IsPaid) throw new InvalidOperationException("Bu sipariş zaten ödenmiş."); IsPaid = true; } }
IsPaid
dışarıdan doğrudan değiştirilemez. İş kuralları sınıfın içinde uygulanır.private
ya da hiç yoktur. Dışarıdan erişime kapalıdır.MakePayment
).EF Core’dakibashpublic class Order { public int Id { get; set; } public decimal TotalAmount { get; set; } public bool IsPaid { get; set; } }
Order
sınıfı sadece bir tablo gibidir.bash{ public int Id { get; private set; } public decimal TotalAmount { get; private set; } public bool IsPaid { get; private set; } public Order(int id, decimal totalAmount) { if (totalAmount <= 0) throw new ArgumentException("Tutar sıfırdan büyük olmalı."); Id = id; TotalAmount = totalAmount; IsPaid = false; } public void MakePayment() { if (IsPaid) throw new InvalidOperationException("Bu sipariş zaten ödenmiş."); IsPaid = true; } }
Order
, siparişin ne zaman oluşturulduğu, ödenip ödenmediği, iptal edilip edilmediği, indirime uğrayıp uğramadığı gibi tüm işsel durumları kapsar.