DTO gibi "esnek" veya soyut bir şey için en iyi uygulamaları oluşturmak zordur. Esasen, DTO'lar yalnızca veri aktarımı için nesnelerdir, ancak hedefe veya aktarımın nedenine bağlı olarak, farklı "en iyi uygulamaları" uygulamak isteyebilirsiniz.
Martin Fowler'ın Kurumsal Uygulama Mimarisi Kalıplarını okumanızı tavsiye ederim . DTO'ların gerçekten ayrıntılı bir bölüm aldığı desenlere adanmış bir bölüm var.
Başlangıçta, pahalı mantıklı aramalarda kullanılmak üzere "tasarlandılar", burada mantığınızın farklı kısımlarından çok fazla veriye ihtiyacınız olacaktır; DTO'lar veri aktarımını tek bir çağrıda yapacaktır.
Yazara göre, DTO'ların yerel ortamlarda kullanılması amaçlanmamıştı, ancak bazı insanlar onlar için bir kullanım buldu. Genellikle farklı POCO'lardan GUI'ler, API'lar veya farklı katmanlar için tek bir varlıkta bilgi toplamak için kullanılırlar.
Şimdi, miras ile, kodun yeniden kullanımı asıl amacından ziyade mirasın bir yan etkisi gibidir; kompozisyon ise temel amaç olarak kodun yeniden kullanımı ile uygulanmaktadır.
Bazı insanlar , her ikisinin de güçlü yönlerini kullanarak ve zayıflıklarını azaltmaya çalışarak, kompozisyon ve mirasın birlikte kullanılmasını önerir. Aşağıdakiler, yeni DTO'lar veya bu konu için herhangi bir yeni sınıf / nesne seçerken veya oluştururken zihinsel sürecimin bir parçası:
- Aynı katman veya bağlam içinde DTO'lar ile kalıtım kullanıyorum. Bir DTO asla bir POCO'dan miras alınmaz, bir BLL DTO asla bir DAL DTO'dan miras kalmaz.
- Kendimi bir alanı bir DTO'dan gizlemeye çalışırken bulursam, yeniden düzenleme yapacağım ve belki kompozisyonu kullanacağım.
- Tek bir DTO tabanından çok az farklı alan tek ihtiyacım olursa, bunları evrensel bir DTO'ya koyacağım. Evrensel DTO'lar yalnızca dahili olarak kullanılır.
- Bir temel POCO / DTO neredeyse hiçbir zaman mantık için kullanılmayacaktır, bu şekilde temel sadece çocuklarının ihtiyaçlarına cevap verir. Tabanı kullanmam gerekirse, çocuklarının asla kullanmayacağı yeni bir alan eklemekten kaçınırım.
Bazıları belki de "en iyi" uygulamalar olmayabilir, üzerinde çalıştığım projeler için gayet iyi çalışıyorlar ama hiçbir boyutun herkese uymadığını hatırlamanız gerekiyor. Evrensel DTO durumunda dikkatli olmalısınız, yöntem imzalarım şöyle görünüyor:
public void DoSomething(BaseDTO base) {
//Some code
}
Yöntemlerden herhangi birinin kendi DTO'suna ihtiyacı varsa ve genellikle miras yapmam gereken tek değişiklik parametredir, ancak bazen belirli durumlar için daha derine inmem gerekir.
Yorumlarınızdan iç içe DTO'lar kullandığınızı görüyorum. Yuvalanmış DTO'larınız sadece diğer DTO'ların bir listesinden oluşuyorsa, yapılacak en iyi şeyin listeyi açmak olduğunu düşünüyorum.
Görüntülemeniz veya üzerinde çalışmanız gereken veri miktarına bağlı olarak, verileri sınırlandıran yeni DTO'lar oluşturmak iyi bir fikir olabilir; Örneğin, UserDTO'nuzda çok fazla alan varsa ve yalnızca 1 veya 2'ye ihtiyacınız varsa, yalnızca bu alanlara sahip bir DTO'ya sahip olmak daha iyi olabilir. Bir DTO'nun katmanını, içeriğini, kullanımını ve faydasını tanımlamak, onu tasarlarken çok yardımcı olacaktır.