Hizmetler her zaman DTO'ları döndürmeli mi, yoksa etki alanı modelleri de döndürebilir mi?


175

Büyük ölçekli bir uygulama tasarlıyorum, DDD tabanlı çok katmanlı mimari kullanıyoruz.

Veri katmanı (depoların uygulanması), etki alanı katmanı (alan modeli ve arayüzlerin tanımı - depolar, hizmetler, iş birimi), hizmet katmanı (hizmetlerin uygulanması) ile MVC'ye sahibiz. Şimdiye kadar, tüm katmanlarda etki alanı modelleri (çoğunlukla varlıklar) kullanıyoruz ve DTO'ları yalnızca görünüm modelleri olarak kullanıyoruz (denetleyicide, hizmet etki alanı model (ler) i ve denetleyici, görünüme geçirilen görünüm modeli oluşturur).

DTO'ları kullanma, kullanma, haritalama ve aktarma hakkında sayısız makale okudum. Kesin bir yanıt olmadığını anlıyorum, ancak etki alanı modellerini hizmetlerden denetleyicilere geri döndürüp döndürmediğinden emin değilim. Etki alanı modelini döndürürsem, denetleyici her zaman görünüme özgü görünüm modeli oluşturduğundan hala görünüme geçmez - bu durumda yasal görünüyor. Öte yandan, etki alanı modeli iş katmanından (hizmet katmanı) ayrıldığında doğru gelmiyor. Bazen hizmetin etki alanında tanımlanmayan veri nesnesini döndürmesi gerekir ve daha sonra eşlenmeyen etki alanına yeni nesne eklememiz veya POCO nesnesi oluşturmamız gerekir (bu, bazı hizmetler etki alanı modelleri döndürdüğü için çirkin olur. etkili bir şekilde DTO'lar döndürür).

Soru - kesinlikle görünüm modellerini kullanırsak, etki alanı modellerini denetleyicilere kadar döndürmek uygun mudur, yoksa hizmet katmanıyla iletişim için her zaman DTO'ları kullanmalı mıyız? Öyleyse, alan adı modellerini hangi hizmetlerin gereksinimine göre ayarlamak uygun mudur? (Açıkçası öyle düşünmüyorum, çünkü hizmetler hangi alanın sahip olduğunu tüketmelidir.) Eğer DTO'lara sıkı sıkıya bağlı kalsak, hizmet katmanında tanımlanmalı mıdır? (Sanırım.) Bazen DTO'ları kullanmamız gerektiği açıktır (örneğin, hizmet çok fazla iş mantığı gerçekleştirdiğinde ve yeni nesneler oluşturduğunda), bazen sadece etki alanı modellerini kullanmamız gerektiği açıktır (örneğin, Üyelik hizmeti anemik Kullanıcı ( s) - etki alanı modeliyle aynı olan DTO oluşturmak pek mantıklı görünmüyor) - ama tutarlılığı ve iyi uygulamaları tercih ediyorum.

Makale Domain vs DTO vs ViewModel - Nasıl ve Ne Zaman Kullanılır? (ve diğer bazı makaleler) sorunuma çok benziyor, ancak bu sorulara cevap vermiyor. Makale DTO'ları EF ile veri havuzunda mı uygulamalıyım? benzerdir, ancak DDD ile ilgilenmez.

Feragatname: Herhangi bir tasarım desenini sadece var olduğu ve süslü olduğu için kullanmayı düşünmüyorum, öte yandan, uygulamayı bir bütün olarak tasarlamaya yardımcı olduğu, ayrılmaya yardımcı olduğu için de iyi tasarım desenleri ve uygulamaları kullanmak istiyorum. Endişe, belirli bir desen kullanmak zor olsa da, en azından şu anda "gerekli" değildir.

Her zaman olduğu gibi teşekkür ederim.


28
Yakına oy veren çocuklar için - lütfen bu soruyu neden fikir tabanlı olarak kapatmak istediğinizi açıklamak ister misiniz?
Robert Goldwein

20
@Aron "Kod İnceleme, akran incelemesi için üzerinde çalıştığınız projelerin kodlarını paylaşmak için bir soru ve cevap sitesidir." - sorum hiç kod hakkında değil, bu yüzden orada konu dışı olurdu; SO: "Karşılaştığınız gerçek sorunla ilgili sorulara odaklanın. Ne denediğiniz ve tam olarak ne yapmaya çalıştığınızla ilgili ayrıntıları ekleyin." - Çözmeye çalıştığım özel uzman problemim var. Bu soruda neyin yanlış olduğunu daha ayrıntılı olarak açıklayabilir misiniz, çünkü buradaki birçok soru mimarlık hakkında ve bu tür sorular görünüşe göre iyi, bu yüzden daha fazla yanlış anlamadan kaçınabiliyorum?
Robert Goldwein

7
Bu soruyu sorduğunuz için teşekkür ederim. Bana bir iyilik yaptın ve hayatımı daha basit ve mutlu ettin, teşekkürler.
Loa

9
@ RobertGoldwein, SO Close Mafya'ya aldırmayın, sorunuz meşru.
hyankov

3
Bu soruyu sorduğunuz için çok teşekkürler
salman

Yanıtlar:


177

etki alanı modeli iş katmanından (hizmet katmanı) ayrıldığında doğru gelmiyor

Bağırsakları doğru çektiğini hissettiriyor mu? Martin Fowler'e göre: Hizmet Katmanı uygulamanın sınırlamasını tanımlar, etki alanını kapsar. Başka bir deyişle, etki alanını korur.

Bazen hizmetin, etki alanında tanımlanmayan veri nesnesini döndürmesi gerekir

Bu veri nesnesine bir örnek verebilir misiniz?

DTO'lara sıkı sıkıya bağlı kalsak, hizmet katmanında tanımlanmalı mıdır?

Evet, çünkü yanıt hizmet katmanınızın bir parçasıdır. "Başka bir yerde" olarak tanımlanmışsa, hizmet katmanının bu "başka bir yere" referans vermesi ve lazona yeni bir katman eklemesi gerekir.

etki alanı modellerini denetleyicilere kadar döndürmek uygun mudur, yoksa hizmet katmanıyla iletişim için her zaman DTO'ları kullanmalı mıyız?

DTO bir yanıt / istek nesnesidir, iletişim için kullanırsanız mantıklıdır. Sunum katmanınızda (MVC-Denetleyicileri / Görünüm, WebForms, ConsoleApp) etki alanı modelleri kullanıyorsanız, sunum katmanı etki alanınıza sıkıca bağlanırsa, etki alanındaki tüm değişiklikler denetleyicilerinizi değiştirmenizi gerektirir.

alan modeliyle aynı olan DTO oluşturmak pek mantıklı görünmüyor)

Bu DTO'nun yeni gözlere dezavantajlarından biridir. Şu anda, kodun kopyalanmasını düşünüyorsunuz , ancak projeniz genişledikçe, özellikle farklı ekiplerin farklı katmanlara atandığı bir takım ortamında çok daha mantıklı olacaktır.

DTO, uygulamanıza ek karmaşıklık katabilir, ancak katmanlarınız da eklenebilir. DTO sisteminizin pahalı bir özelliğidir, ücretsiz gelmezler.

Neden DTO kullanılır

Bu makale bir DTO kullanmanın hem avantajını hem de dezavantajını sağlar, http://guntherpopp.blogspot.com/2010/09/to-dto-or-not-to-dto.html

Özet aşağıdaki gibidir:

Ne Zaman Kullanılır

  • Büyük projeler için.
  • Proje ömrü 10 yıl ve üzerindedir.
  • Stratejik, kritik görev uygulaması.
  • Büyük takımlar (5'ten fazla)
  • Geliştiriciler coğrafi olarak dağıtılır.
  • Alan adı ve sunum farklıdır.
  • Genel veri alışverişini azaltın (DTO'nun asıl amacı)

Ne Zaman Kullanılmamalıdır

  • Küçük - orta boy proje (maksimum 5 üye)
  • Proje ömrü 2 yıldır.
  • GUI, arka uç vb.İçin ayrı bir ekip yok.

DTO'ya Karşı İddialar

DTO ile Bağımsız Değişkenler

  • DTO olmadan, sunum ve etki alanı sıkı bir şekilde birleştirilir. (Bu küçük projeler için uygundur.)
  • Arayüz / API kararlılığı
  • Yalnızca kesinlikle gerekli olan öznitelikleri içeren bir DTO döndürerek sunum katmanı için optimizasyon sağlayabilir. Linq projeksiyonunu kullanarak , tüm objeyi çekmek zorunda değilsiniz.
  • Geliştirme maliyetini azaltmak için kod oluşturma araçlarını kullanın

3
Merhaba, Cevabınız için teşekkür ederim, bunun için gerçekten iyi bir özet ve bağlantılar için teşekkürler. Cümle "Bazen hizmetin etki alanında tanımlanmamış veri nesnesini döndürmesi gerekir" kötü seçildi, hizmetin bir havuzdaki (örneğin, öznitelikler) birkaç DO'yu birleştirdiği ve bu özniteliklerin bir bileşimi olarak bir POCO ürettiği anlamına gelir. iş mantığı). Yine, gerçekten güzel bir cevap için teşekkürler.
Robert Goldwein

1
Önemli bir performans değerlendirmesi, bu etki alanı modellerinin veya DTO'ların hizmetinizden nasıl iade edildiğidir. EF ile, etki alanı modellerinin somut bir koleksiyonunu döndürmek için bir sorgu gerçekleştirirseniz (örneğin .ToArray () veya ToList () ile), gerçekleşen nesneleri doldurmak için tüm sütunları seçersiniz. Bunun yerine DTO'yu sorguya yansıtırsanız, EF yalnızca DTO'nuzu doldurmak için gereken sütunları seçmek için akıllıdır, bu da bazı durumlarda aktarılacak önemli ölçüde daha az veri olabilir.
snort

10
Nesnelerinizi 'elle' eşleyebilirsiniz. Biliyorum, sıkıcı şeyler, ancak model başına 2-3 dakika sürer ve çok fazla yansıma kullandığınızda her zaman çok fazla sorun getirme olasılığı vardır (AutoMapper vb.)
Razvan Dumitru

1
çok basit ve bu tür içeriklerle cevap verdiğiniz için teşekkürler. Bana bir iyilik yaptın ve hayatımı daha basit ve mutlu ettin, teşekkürler.
Loa

1
Yavaşlamak için 10 milyon projemiz iptal edildi ... Neden yavaştı? DTO nesnesini refelection kullanarak her yere aktarma. Dikkatli ol. Automapper ayrıca yansıma kullanır.
RayLoveless

11

DDD yaklaşımından geçmeye karar verdiğiniz için uygulamanız yeterince büyük ve karmaşık görünüyor. Hizmet katmanınızdaki poco varlıklarınızı veya etki alanı varlıklarını ve değer nesnelerini döndürmeyin. Bunu yapmak istiyorsanız, artık ihtiyacınız olmadığından hizmet katmanınızı silin! Görünüm Modeli veya Veri aktarımı nesneleri, etki alanı modeli üyeleriyle eşleşmeleri veya tam tersi olması nedeniyle Hizmet katmanında yaşamalıdır. Öyleyse neden DTO'ya ihtiyacınız var? Çok sayıda senaryo içeren karmaşık uygulamada, etki alanı ve sunum görünümlerinin endişelerini ayırmalısınız, bir etki alanı modeli birkaç DTO'ya bölünebilir ve ayrıca birkaç Etki Alanı modeli bir DTO'ya daraltılabilir. Bu nedenle, modelinizle aynı olsa bile DTO'nuzu katmanlı mimaride oluşturmak daha iyidir.

Hizmet katmanıyla iletişim için her zaman DTO'ları kullanmalı mıyız? Evet, etki alanı modeli üyeleriyle hizmet katmanındaki deponuzla konuştuğunuzda DTO'yu hizmet katmanınız tarafından döndürmeniz ve bunları DTO'ya eşlemeniz ve MVC denetleyicisine geri dönmeniz veya tersini yapmanız gerekir.

Etki alanı modellerini hangi hizmetlerin gereksinimine göre ayarlamak uygun mudur? Bir hizmet sadece depo ve etki alanı yöntemleriyle ve etki alanı hizmetleriyle konuşur, etki alanınızdaki işletmeyi gereksinimlerinize göre çözmelisiniz ve etki alanına neyin gerekli olduğunu söylemek hizmet görevi değildir.

DTO'lara sıkı sıkıya bağlı kalsak, hizmet katmanında tanımlanmalı mıdır? Evet, hizmet katmanındaki etki alanı üyelerine eşlenmeleri gerektiğinden DTO veya ViewModel'i daha sonra hizmete almayı deneyin ve DTO'yu uygulamanızın denetleyicilerine yerleştirmek iyi bir fikir değildir ( Hizmet katmanınızda Yanıt İsteği kalıbı kullanmaya çalışın ), şerefe !


1
bunun için üzgünüm! burada görebilirsiniz ehsanghanbari.com/blog/Post/7/…
Ehsan

10

Deneyimlerime göre pratik olanı yapmalısınız. "En iyi tasarım işe yarayan en basit tasarımdır" - Einstein. Bu zihinle ...

Kesinlikle görünüm modellerini kullanırsak, etki alanı modellerini denetleyicilere kadar döndürmek uygun mudur, yoksa hizmet katmanıyla iletişim için her zaman DTO'ları kullanmalı mıyız?

Kesinlikle sorun yok! Etki Alanı Varlıkları, DTO'lar ve Görünüm Modelleri varsa, veritabanı tabloları dahil olmak üzere uygulamadaki tüm alanları 4 yerde tekrarlayabilirsiniz. Etki Alanı Varlıkları ve Görünüm Modellerinin iyi çalıştığı büyük projelerde çalıştım. Bunun tek istisnası, uygulamanın dağıtılmış olması ve hizmet katmanının başka bir sunucuda bulunmasıdır; bu durumda DTO'ların serileştirme nedenleriyle kablo üzerinden gönderilmesi gerekir.

Öyleyse, alan adı modellerini hangi hizmetlerin gereksinimine göre ayarlamak uygun mudur? (Açıkçası öyle düşünmüyorum, çünkü hizmetler alan adının ne olduğunu tüketmelidir.)

Genellikle kabul eder ve hayır derim çünkü Domain modeli genellikle iş mantığının bir yansımasıdır ve genellikle bu mantığın tüketicisi tarafından şekillenmez.

DTO'lara sıkı sıkıya bağlı kalsak, hizmet katmanında tanımlanmalı mıdır? (Sanırım.)

Onları kullanmaya karar verirseniz kabul ediyorum ve evet diyorum, hizmet katmanı günün sonunda DTOs döndürüyor gibi mükemmel bir yerdir.

İyi şanslar!


8

Bu partiye geç kaldım, ama bu çok yaygın ve önemli bir soru.

"Hizmetler" ile mavi kitapta Evan's tarafından tanımlanan "Uygulama Katmanı" mı kastedilmektedir ? Sana bu durumda cevap onlar gerektiğidir yapmak varsayıyoruz değil DTOs dönün. Mavi alandaki "Etki Alanını Ayırma" başlıklı 4. bölümü okumanızı öneririm.

Bu bölümde Evans katmanlar hakkında şunları söylüyor:

Karmaşık bir programı katmanlara ayırın. Her katmanın içinde, yalnızca aşağıdaki katmanlara bağlı olan ve uyumlu bir tasarım geliştirin.

Bunun için iyi bir sebep var. Kısmi düzen kavramını yazılım karmaşıklığının bir ölçüsü olarak kullanırsanız, bir katmanın üstündeki bir katmana bağlı olması, karmaşıklığı artırır, bu da sürdürülebilirliği azaltır.

Bunu sorunuza uyguladığınızda, DTO'lar gerçekten Kullanıcı Arayüzü / Sunum katmanı ile ilgili bir bağdaştırıcıdır. Uzaktan / çapraz süreç iletişiminin tam olarak bir DTO'nun amacı olduğunu unutmayın (bu yazıda, aynı zamanda DDD dilinden bahsetmese de, DTO'ların bir hizmet katmanının parçası olmalarına karşı olduğunu da belirtmek gerekir).

Uygulama katmanınız bu DTO'lara bağlıysa, kendisinin üstündeki bir katmana bağlıdır ve karmaşıklığınız artar. Bunun, yazılımınızı korumanın zorluğunu artıracağını garanti edebilirim.

Örneğin, sisteminiz her biri kendi DTO'su gerektiren diğer birkaç sistem veya istemci türüyle arayüz oluşturuyorsa ne olur? Uygulama hizmetinizin hangi DTO yönteminin geri dönmesi gerektiğini nasıl anlarsınız? Tercih ettiğiniz dil, dönüş türüne göre bir yöntemin (bu durumda servis yöntemi) aşırı yüklenmesine izin vermiyorsa bu sorunu nasıl çözebilirsiniz? Bir yol bulsanız bile, bir Sunum katmanı sorununu desteklemek için Uygulama Katmanınızı neden ihlal ediyorsunuz?

Pratik açıdan, bu bir spagetti mimarisi ile sona erecek bir yolda bir adımdır. Kendi deneyimlerimde bu tür bir devrim ve sonuçlarını gördüm.

Şu anda çalıştığım yerde, Uygulama Katmanımızdaki hizmetler etki alanı nesnelerini döndürüyor. Bu Arabirimi beri bir sorun olarak görmüyorum (yani UI / Sunum) tabakasıdır Alan katmanında, bağlı olduğu aşağıda bunun. Ayrıca, bu bağımlılık "yalnızca başvuru" türüne bağımlıdır, çünkü:

a) Arayüz Katmanı, bu Etki Alanı nesnelerine yalnızca Uygulama katmanına yapılan çağrılarla elde edilen salt okunur dönüş değerleri olarak erişebilir

b) Uygulama Katmanı'ndaki hizmetlere ilişkin yöntemler, yalnızca katmanda "ham" girdi (veri değerleri) veya nesne parametreleri (gerektiğinde parametre sayısını azaltmak için) olarak kabul eder. Özellikle, uygulama hizmetleri Etki Alanı nesnelerini hiçbir zaman girdi olarak kabul etmez.

Arayüz Katmanı, Etki Alanı nesnelerinden DTO'lara eşlemek için Arayüz Katmanı içinde tanımlanan eşleme tekniklerini kullanır. Yine, bu DTO'ları Arayüz Katmanı tarafından kontrol edilen adaptörler olmaya odaklar.


1
Hızlı soru. Şu anda uygulama katmanımdan ne döneceğime dönüyorum. Etki alanı varlıklarını uygulama katmanından döndürmek yanlış geliyor. Alan adını gerçekten "dışarıya" sızdırmak istiyor muyum? Bu yüzden uygulama katmanından DTO'ları düşünüyordum. Ama bu başka bir model daha ekliyor. Yanıtınızda, Etki Alanı modellerini "salt okunur dönüş değerleri" olarak döndürdüğünüzü söylediniz. Bunu nasıl yaptın? Yani, onları sadece nasıl okursun?
Michael Andrews

Sanırım sadece pozisyonunu benimseyeceğim. Uygulama hizmetleri Etki Alanı modellerini döndürür. Bağlantı noktası bağdaştırıcı katmanları (REST, sunu vb.) Daha sonra bunları kendi modellerine dönüştürür (model veya gösterimleri görüntüleyin). Uygulama ve bağlantı noktası bağdaştırıcıları arasına bir DTO modeli eklemek aşırıya kaçmış gibi görünüyor. Geri dönen etki alanı modelleri hala DIP'ye bağlı kalır ve etki alanı mantığı sınırlı bağlamda kalır (mutlaka uygulama sınırının içinde değildir. Ancak bu iyi bir uzlaşma gibi görünüyor).
Michael Andrews

@MichaelAndrews, cevabımın yardımcı olduğunu duyduğuma sevindim. Re: döndürülen nesnelerin salt okunur olduğu ile ilgili sorunuz, nesnelerin kendileri gerçekten salt okunur değildir (yani değişmez). Demek istediğim, uygulamada (en azından tecrübemde) gerçekleşmiyor. Bir etki alanı nesnesini güncellemek için Arayüz Katmanı a) etki alanı nesnesinin deposuna başvuruda bulunmalı veya b) yeni aldığı nesneyi güncellemek için Uygulama Katmanına geri dönmelidir. Bunlardan her ikisi de iyi DDD uygulamalarının o kadar açık ihlalleridir ki, kendileri tarafından uygulanıyorlar. Eğer ilgilenirseniz cevabı iptal etmekten çekinmeyin.
BitMask777

Bu cevap birkaç nedenden dolayı benim için çok sezgisel. İlk olarak, aynı Uygulama Katmanını birkaç kullanıcı arayüzü (API'ler, Kontrolörler) için tekrar kullanabiliriz ve her biri modeli uygun gördüğü şekilde dönüştürebilir. İkincisi, eğer App'te modeli DTO'ya dönüştürecek olsaydık. Katman, bu DTO App tanımlanır anlamına gelir. DTO artık Sınırlı Bağlamımızın bir parçası (yani mutlaka Etki Alanı değil) anlamına gelen katman - bu sadece yanlış geliyor.
Robotron

1
Sana bir takip sorusu sormak üzereydim ve sonra zaten cevapladığını gördüm: "uygulama hizmetleri asla Domain nesnelerini girdi olarak kabul etmez". Yapabilirsem tekrar +1 olurdum.
Robotron

5

Partiye geç kaldım, ama tam olarak aynı tür mimariyle karşı karşıyayım ve “sadece hizmetten DTO'lar” a yöneliyorum. Bunun temel nedeni, yalnızca nesne içindeki geçerliliği korumak için etki alanı nesnelerini / toplamalarını kullanmaya karar vermiş olmamdır, bu nedenle yalnızca güncelleme, oluşturma veya silme sırasında. Verileri sorgularken EF'i yalnızca depo olarak kullanırız ve sonucu DTO'larla eşleştiririz. Bu, genellikle hızlı oldukları gibi veritabanı işlevlerini kullanarak, okuma sorgularını optimize etmemize ve bunları iş nesnelerine uyarlamamıza izin verir.

Her hizmet yöntemi kendi sözleşmesini tanımlar ve bu nedenle zaman içinde bakımı daha kolaydır. Umuyorum.


1
Yıllar sonra tam olarak burada bahsettiğiniz nedenlerle aynı sonuca vardık.
Robert Goldwein

@RobertGoldwein Harika! Kararımda kendime daha çok güveniyorum. :-)
Niklas Wulff

@NiklasWulff: bu nedenle, söz konusu Dtos artık Uygulama Katmanı sözleşmesinin bir parçası, yani çekirdek / alanın bir parçası. Web API geri dönüş türleri ne olacak? Yanıtınızda belirtilen Dtos'u açıklıyor musunuz veya Web API katmanında tanımlanmış özel Görünüm Modelleriniz var mı? Ya da farklı bir şekilde ifade etmek gerekirse: Dtos'u Modelleri Görüntülemek için eşliyor musunuz?
Robotron

1
@Robotron Web API'miz yok, MVC kullanıyoruz. Evet, dto: ları farklı görünüm modellerine eşleştiriyoruz. Genellikle bir görünüm modeli, web sayfasını görüntülemek için başka birçok şey içerir, bu nedenle dto: s'deki veriler yalnızca görünüm modelinin bir parçasını oluşturur
Niklas Wulff

4

Şimdiye kadar, tüm katmanlarda etki alanı modelleri (çoğunlukla varlıklar) kullanıyoruz ve DTO'ları yalnızca görünüm modelleri olarak kullanıyoruz (denetleyicide, hizmet etki alanı model (ler) i ve denetleyici, görünüme geçirilen görünüm modeli oluşturur).

Etki Alanı Modeli, tüm uygulamanız için terminoloji ( Ubiquitous Language ) sağladığı için Etki Alanı Modelini yaygın olarak kullanmak daha iyidir.

ViewModels / DTO'ları kullanmanın tek nedeni , uygulamanızda (her türlü sunum katmanı) ve (Alan Modeli) ayırmak için MVC kalıbının uygulanmasıdır . Bu durumda sunumunuz ve alan adı modeliniz gevşek bir şekilde birleştirilir.ViewModel

Bazen hizmetin etki alanında tanımlanmamış veri nesnesini döndürmesi gerekir ve ardından eşlenmeyen etki alanına yeni nesne eklememiz veya POCO nesnesi oluşturmamız gerekir (bazı hizmetler etki alanı modellerini döndürdüğü için bu çirkin, bazı etkili bir şekilde DTO'lar döndürür).

Application / Business / Domain Logic hizmetleri hakkında konuştuğunuzu varsayıyorum.

Mümkün olduğunda alan adı varlıklarını iade etmenizi öneririm. Ek bilgi döndürmek gerekirse, birkaç etki alanı varlığını barındıran DTO döndürmek kabul edilebilir.

Bazen, etki alanı varlıkları üzerinden proxy oluşturan 3. bölüm çerçeveler kullanan kişiler, hizmet alanlarından etki alanı varlıklarını göstermekte zorluklarla karşılaşırlar, ancak bu yalnızca yanlış kullanım sorunudur.

Soru - kesinlikle görünüm modellerini kullanırsak, etki alanı modellerini denetleyicilere kadar döndürmek uygun mudur, yoksa hizmet katmanıyla iletişim için her zaman DTO'ları kullanmalı mıyız?

Etki alanı varlıklarını% 99,9 oranında iade etmenin yeterli olduğunu söyleyebilirim.

DTO'ların oluşturulmasını kolaylaştırmak ve etki alanı varlıklarınızı bunlarla eşleştirmek için AutoMapper kullanabilirsiniz .


4

Etki alanı modelinizin bir kısmını döndürürseniz, bu bir sözleşmenin bir parçası haline gelir. Bir kontrat değiştirmek, bağlamınız dışındaki şeyler ona bağlı olduğundan zordur. Bu nedenle, alan adı modelinizin bir parçasının değiştirilmesini zorlaştırırsınız.

Bir etki alanı modelinin çok önemli bir yönü, değiştirilmesinin kolay olmasıdır. Bu bizi alan adının değişen gereksinimlerine esnek hale getiriyor.


2

Bu iki soruyu analiz etmenizi öneririm:

  1. Üst katmanlarınız (ör. Modelleri / denetleyicileri görüntüleme ve görüntüleme) verileri, alan katmanının gösterdiklerinden farklı bir şekilde mi tüketiyor? Çok fazla haritalama veya hatta mantık varsa, tasarımınızı tekrar gözden geçirmenizi öneririm: muhtemelen verilerin gerçekte nasıl kullanıldığına daha yakın olmalıdır.

  2. Üst katmanlarınızı derinden değiştirme olasılığınız nedir? (örn. WPF için ASP.NET'in değiştirilmesi). Bu durumdan çok farklıysa ve mimariniz çok karmaşık değilse, olabildiğince çok alan varlığını ifşa etmekten daha iyi olabilirsiniz.

Korkarım ki bu oldukça geniş bir konu ve gerçekten sisteminizin ne kadar karmaşık olduğuna ve gereksinimlerine bağlı.


Bizim durumumuzda, üst tabaka kesinlikle değişmeyecek. Bazı durumlarda, hizmet oldukça benzersiz bir POCO nesnesi döndürür (daha fazla etki alanından (ör. Kullanıcı ve sahip olduğu dosyalar) oluşturulur, bazı durumlarda bir hizmet yalnızca etki alanı modeli döndürür - örneğin, "FindUserByEmail () sonucu Kullanıcı etki alanı modeli döndürmelidir - ve İşte benim endişem, bazen hizmet (ler )imiz alan modelini, bazen yeni DTO'yu döndürüyor - ve bu tutarsızlığı sevmiyorum, yapabildiğim kadar çok makale okuyorum ve çoğunluk bunu kabul ediyor gibi görünüyor Etki Alanı Modeli <-> DTO 1: 1, etki alanı modeli hizmet katmanından ayrılmamalıdır - bu yüzden yırtıldım
Robert Goldwein

Böyle bir senaryoda ve katman oluşturma işleminizin daha tutarlı olması için haritalama ile birlikte yapacağım ekstra geliştirme çabasını taşıyabilmeniz şartıyla.
jnovo

1

Deneyimlerime göre, bir OO UI deseni (çıplak nesneler gibi) kullanmadığınız sürece, etki alanı nesnelerini UI'ye maruz bırakmak kötü bir fikirdir. Çünkü uygulama büyüdükçe, kullanıcı arayüzünden gelen ihtiyaçlar değişir ve nesnelerinizi bu değişikliklere uyum sağlamaya zorlar. Sonunda iki usta hizmet ediyorsunuz: çok acı verici bir deneyim olan UI ve DOMAIN. İnanın bana, orada olmak istemezsiniz. Kullanıcı arabirimi modeli, kullanıcı ile iletişim kurma işlevine sahiptir, iş kurallarını korumak için DOMAIN modeli ve kalıcılık modelleri, verilerin etkili bir şekilde depolanmasıyla ilgilenir. Hepsi uygulamanın farklı ihtiyaçlarına hitap eder. Bu konuda bir blog yazısı yazmanın ortasındayım, bittiğinde ekleyeceğim.

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.