DTO Kullanımına Varlık


15

Temel katmanlı bir web uygulaması için bir akış bulmaya çalışıyor ve çevrimiçi çakışan bilgileri okuyor. Ne anlamaya çalışıyorum hala bir çeşit eşleştirici kullanarak DAO hizmet katmanı DTO nesneleri kullanmak için bir avantaj varsa.

Öngörülen temel akış aşağıdaki gibidir:

  1. Kullanıcı Arayüzü Modeli / Formu -> Denetleyici
  2. Denetleyici Modeli Etki Alanı Nesnesine (Varlık) dönüştürür
  3. Etki Alanı Nesnesi -> Hizmet Katmanı
  4. Etki Alanı Nesnesi -> DAO
  5. DAO -> Alan Adı Nesneleri
  6. Hizmet -> Kullanıcı Arayüzü
  7. UI, Etki Alanını UI modellerine dönüştürür

DTO takip edilirse DAO, Varlığı değil bir DTO'yu geri gönderir. Biraz okuma yaptıktan sonra (en azından Java'da) varlıklar açıklamalı POJO'lar haline geldiği için DTO biraz bozulmuş gibi görünüyor, bu da bellek ayak izlerinin çok küçük hale geldiği anlamına geliyor.

Bu durumda mı yoksa DTO'lar, etki alanı nesnelerini DAO katmanı içinde tamamen kapsüllemek için kullanılmalıdır ve bu durumda, hizmet katmanı DAO'ya ne iletir?

Çok teşekkürler!

Yanıtlar:


20

Bana göre, örneğin JPA tarafından yönetilen bir fasulye gibi, karar verilebilir bir POJO'yu geçmek iyi bir uygulama değildir.

Neden?

Üç ana neden görüyorum:

  1. Tembel koleksiyonlarla ilgili potansiyel sorun. http://java.dzone.com/articles/avoid-lazy-jpa-collections
  2. Varlık davranış içermelidir ( Anemik etki alanı modelinin aksine ) Kullanıcı arayüzünüzün beklenmedik davranışlar çağırmasına izin vermek istemeyebilirsiniz.
  3. Anemik etki alanı modeli olması durumunda, modeldeki her yeni değişiklik kullanıcı arayüzünü kırabileceğinden, model yapınızı kullanıcı arayüzüne maruz bırakmak istemeyebilirsiniz.

Hizmet katmanımın varlıkları her iki yönde ilgili DTO'ya dönüştürmesine izin vermeyi tercih ediyorum. DAO hala dönen varlık (dönüşümü sağlamak onun işi değil).


Bunu doğru anlıyorsam, hizmet esasen sadece DTO nesneleri ile ilgilenir ve hem UI hem de DAO'nun aracısı olarak işlev görür. Ayrıca, 3. noktada, DTO'nuzu çalışılabilir UI öğelerine dönüştürmeniz gerekir, bu nedenle bir etki alanı güncellemesi, DTO'nun da güncellenmesi gerektiğinden hala kullanıcı arayüzünü bozmaz.
dardo

1
@dardo UI öğeleri DTO'dur ya da en kötüsü, sunucu tarafında bazı hizmetleri çağırmadan önce DTO'ya dönüştürülmelidir. DTO'nun sık sık değişmesi muhtemel değildir, sadece kurumlarınızdan UI ihtiyaçlarına odaklanan adaptasyon vardır. Ayrıca, hizmet katmanı hem DTO hem de varlıklar ile ilgilenmelidir.
Mik378

Ah tamam, anlamadığım bir hıçkırık var. Anemik etki alanı modeli çalıştığım yerde oldukça yaygındır ve daha ince bir hizmet katmanını teşvik etmek için paradigmayı biraz değiştirmeye çalışıyorum. Tekrar teşekkürler!
dardo

@dardo Bu kitabı okuyabilirsiniz. (veya şirketinize gösterin;)) Harika bir kitap: amazon.com/Implementing-Domain-Driven-Design-Vaughn-Vernon/dp/…
Mik378

aslında bu bir kindle var, amazon.com/Domain-Driven-Design-Tackling-Complexity-Software/dp/… şimdiye kadar oldukça iyi = D
dardo 17:13

13

Bu tartışmanın tekrar tekrar ortaya çıkmasının nedenlerinden biri, ihtiyacınız olan tüm verileri içeren bir nesneyi almak ve onu özdeş veya neredeyse aynı olan bir nesneye dönüştürmek gibi ciddi bir acı çekiciliği gibi görünüyor. teslim ediyorsunuz.

Doğru, bu bir PITA. Ancak bunu yapmanın birkaç nedeni vardır (yukarıda sayılanların yanı sıra).

  • Etki alanı nesneleri çok ağırlaşabilir ve arama için çok fazla işe yaramaz bilgi içerebilir. Bu şişkinlik, iletilen, sıralanan / paylaşılmayan ve ayrıştırılan tüm veriler nedeniyle kullanıcı arayüzünü yavaşlatır. Bir FE'nin web servislerinize atıfta bulunan ve AJAX veya başka bir çok iş parçacıklı yaklaşımla çağrıldığı çok sayıda bağlantıya sahip olacağını düşündüğünüzde, hızlı bir şekilde kullanıcı arayüzünüzü yavaşlatacaksınız. Tüm bunlar web servislerinin genel ölçeklenebilirliğine ulaşıyor
  • Güvenlik çok fazla veri ortaya çıkarılarak kolayca tehlikeye atılabilir. DTO sonucundan çıkarmazsanız, en azından kullanıcıların e-posta adreslerini ve telefon numaralarını gösterebilirsiniz.
  • Pratik hususlar: 1 nesnenin kalıcı bir alan nesnesi VE DTO olarak geçit vermesi için koddan daha fazla ek açıklama içermesi gerekir. Nesnelerin katmanlardan geçerken durumunu yönetmeyle ilgili herhangi bir sorun yaşarsınız. Genel olarak bu, yönetilecek bir PITA'dan daha sonra, bir alan nesnesinden bir DTO'ya alanların kopyalanması hedisini yapıyor.

Ancak, çeviri mantığını dönüştürücü sınıflarının bir koleksiyonuna yerleştirirseniz, bunu oldukça etkili bir şekilde yönetebilirsiniz.

'Convert (domainObj, toDto)' yapabileceğiniz lambdaJ'a bir göz atın, koleksiyonlarda kullanım için bunun aşırı yüklenmesi var. İşte bunu kullanan bir denetleyici yöntemi örneği. Gördüğünüz gibi, o kadar da kötü görünmüyor.

    @GET
    @Path("/{id}/surveys")
    public RestaurantSurveys getSurveys(@PathParam("id") Restaurant restaurant, @QueryParam("from") DateTime from, @QueryParam("to") DateTime to) {

        checkDateRange(from, to);

        MultiValueMap<Survey, SurveySchedule> surveysToSchedules = getSurveyScheduling(restaurant, from, to);
        Collection<RestaurantSurveyDto> surveyDtos = convert(surveysToSchedules.entrySet(), SurveyToRestaurantSurveyDto.getInstance());
        return new RestaurantSurveys(restaurant.getId(), from, to, surveyDtos);

    }

Girdi için teşekkürler, ve benim düşüncem aynı çizgiler boyunca =)
dardo
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.