Merak ediyorum çünkü öyleyse neden Entity Framework, katmanları arasında veri aktarmak için aynı özelliklere sahip yeni bir nesne oluşturmak için mantık sunmuyor?
Varlık çerçevesini kullanarak ürettiğim varlık nesnelerini kullanırım.
Merak ediyorum çünkü öyleyse neden Entity Framework, katmanları arasında veri aktarmak için aynı özelliklere sahip yeni bir nesne oluşturmak için mantık sunmuyor?
Varlık çerçevesini kullanarak ürettiğim varlık nesnelerini kullanırım.
Yanıtlar:
Sana bağlı.
Çoğu insan size bunun iyi bir uygulama olmadığını söyler, ancak bazı durumlarda bu durumdan kurtulabilirsiniz.
EF, DDD ile hiçbir zaman birçok nedenden ötürü iyi oynamadı, ancak iki öne çıkıyor: varlıklarınızda parametreleştirilmiş yapıcılar olamaz ve koleksiyonları kapatamazsınız. DDD buna bağlıdır, çünkü etki alanı modeli hem veri hem de davranış içermelidir.
Bir şekilde, EF sizi anemik bir etki alanı modeline zorlar ve bu durumda varlıkları DTO'lar olarak kullanabilirsiniz. Navigasyon özelliklerini kullanıyorsanız bazı sorunlarla karşılaşabilirsiniz ancak bu varlıkları seri hale getirip tel üzerinden gönderebilirsiniz. Yine de pratik olmayabilir. Göndermeniz gerekmeyen özelliklere sahip olan her varlık için serileştirmeyi kontrol etmeniz gerekecektir. En kolay yol, basitçe veri aktarımı için uyarlanmış ayrı sınıflar tasarlamaktır. AutoMapper gibi kütüphaneler bu amaç için oluşturulmuştur.
Örneğin: Person
Aşağıdaki tanımla adlandırılan bir sınıfınız olduğunu varsayalım :
public class Person
{
public int Id { get; set; }
public string FirstName { get; set; }
public string LastName { get; set; }
public DateTime DateOfBirth { get; get; }
// plus a bunch of other properties relevant about a person
}
Eğer bir yere çalışanların listesini görüntülemek istediğiniz varsayarsak, sadece göndermeye pratik olabilir Id
, FirstName
ve LastName
. Ancak diğer tüm ilgisiz mülkleri göndermeniz gerekir. Cevabın büyüklüğünü umursamıyorsanız, mesele o kadar da büyük değil, ancak genel fikir yalnızca ilgili verileri göndermek. Öte yandan, bir kişi listesi döndüren bir API tasarlayabilir ve bu durumda tüm özellikleri göndermeniz gerekebilir, böylece varlıkları seri hale getirmek ve göndermek mantıklı olabilir. Bu durumda, bir DTO sınıfı oluşturmak tartışılabilir. Bazıları varlıkları ve DTO'ları karıştırmayı sever, bazıları değildir.
Güncellenen sorunuzu yanıtlamak için EF bir ORM'dir. Görevi, veritabanı kayıtlarını nesnelere eşlemektir ve bunun tersi de geçerlidir. EF'den geçmeden önce ve sonra bu nesnelerle yaptıklarınız endişelerinin bir parçası değildir. Olmamalı.
Hayır öyle değil.
İdeal olarak, DTO'lar kalıcılık depolarınızla eşleşecektir (diğer bir deyişle veritabanı tablolarınız).
Ancak işletme sınıflarınız mutlaka bir eşleşme değildir. Veritabanınızdakilerle ilgili ek sınıflara veya ayrı veya birleştirilmiş sınıflara ihtiyacınız olabilir. Uygulamanız küçükse, bu tür sorunları gerçekten göremeyebilirsiniz, ancak orta ila büyük uygulamalarda bu çok sık olur.
Bir başka şey de, DTO'ların ısrarla uğraşma konusundaki alanın bir parçası olduğu ve İşletme Katmanınız hakkında hiçbir şey bilmemesi gerektiğidir.
Bu aslında çok kötü bir fikir. Martin Fowler'ın Yerel DTO'lar hakkında bir makalesi var .
Uzun lafın kısası, DTO
Pattern, işlemin dışında, örneğin aynı işlemin içindeki katmanlar arasında değil, örneğin kablo üzerinden veri aktarmak için kullanıldı.
Hayır, bu kötü bir uygulama.
Bazı nedenler:
@JsonIgnore
Java dünyasında olduğu gibi) kullanarak alanları yok sayabilirsiniz , ancak bu bir sonraki soruna yol açar ...get
işletmenin bir yöntemini çağırmak için .Bu nedenle, varlık alanlarını Dto ile eşleyerek bu işte size yardımcı olmak için bir tür eşleme aracı kullanmak daha kolay ve güvenlidir.
@Dherik’in söylediklerini tamamlamak için, varlık nesnelerini veri aktarma nesneleri olarak kullanmanın temel sorunları şunlardır:
Bir işlemde, bir DTO olarak kullandığınız için varlığınızda yapılan değişiklikleri yapma riskini alırsınız (bir işlemi oturumun varlığından ayırabilseniz bile, çoğu zaman önce bu durumu kontrol etmeniz gerekir) Varlık DTO'nuzdaki herhangi bir değişiklik ve bir işlemde olmadığınızı veya değişikliklerin devam etmesini istemiyorsanız oturumun kapatıldığından emin olun).
İstemci ile sunucu arasında paylaştığınız verilerin boyutu: bazen, isteğin yanıtının boyutunu en aza indirmek için varlığın tüm içeriğini müşteriye göndermek istemezsiniz. DTO'yu varlıktan ayırmak, bazı kullanım durumlarında göndermek istediğiniz verileri özelleştirmek için daha esnektir.
Görünürlük ve bakım: Kurumunuzun alanlarındaki jpa / hazırda bekletme ek açıklamalarınızı yönetmeli ve aynı yerde json'da serileştirmek için jackson ek açıklamalarını korumanız gerekir (bunları kurum tarafından devralınan arabirime yerleştirmek için bunları varlık uygulamasından ayırabilirseniz bile) varlıktır). Ardından, DTO içeriğinizi yeni bir alan ekleyerek değiştirirseniz, başka bir kişi muhtemelen kuruluşun bir alanı olduğunu düşünebilir, bu nedenle veritabanınızla ilgili tablonun bir alanı olabilir ( @Transient
tüm DTO alanlarınızda ek açıklama kullanabilseniz bile) Dava için ..!).
Bence, varlığı okuduğunuzda ses çıkarıyor ama benim görüşüm kesinlikle öznel.