DTO = ViewModel?


103

Etki alanı nesnelerimi sürdürmek için NHibernate kullanıyorum. İşleri basit tutmak için hem sunum katmanım hem de hizmet katmanım olarak bir ASP.NET MVC projesi kullanıyorum.

Etki alanı nesnelerimi denetleyici sınıflarımdan XML olarak döndürmek istiyorum. Burada Stack Overflow'da bazı yazıları okuduktan sonra DTO'ların gitmenin yolu olduğunu anladım. Bununla birlikte, ViewModel hakkında konuşan gönderilere de rastladım.

Sorum: Veri Aktarım Nesneleri ve ViewModels aynı şey midir? Yoksa ViewModel, bir DTO'nun bir tür alt kalıbı mıdır?


9
Çoğu yanıt MVVM'den bahsettiğinden ve ASP.NET MVC ile çalıştığınızdan, ASP.NET MVC'deki ViewModels'in WPF'deki (MVVM) ViewModels'e% 100 eşdeğer olmadığını belirtmekle ilgili olduğunu düşünüyorum.
Matthijs Wessels

Yanıtlar:


106

Bir DTO'nun kanonik tanımı, herhangi bir davranışı olmayan bir nesnenin veri şeklidir.

ViewModels, görünümün modelidir. ViewModel'ler tipik olarak, bir veya daha fazla nesneden (veya DTO'lardan) alınan tam veya kısmi veriler artı görünümün davranışına özgü ek üyelerdir (görünüm tarafından yürütülebilen yöntemler, görünüm öğelerinin nasıl değiştirildiğini gösteren özellikler vb ...). Görünüm modeline, bir görünüm artı davranışlar için tüm veriler olarak bakabilirsiniz. ViewModels, bire bir iş nesneleri veya DTO'larla eşleşebilir veya eşleşmeyebilir.

Bu arada, belirli bir görünüm modelinin kalıcı bir nesneden gelen verilerin bir alt kümesine ihtiyacı varsa , NHibernate projeksiyonları işe yarar.


Bunu açıklayabilir misiniz: "DTO, herhangi bir davranışı olmayan bir nesnenin veri şeklidir"?
roozbeh S

2
Anlamı ... DTO sınıfı genellikle yalnızca özellikleri içerir ve iş mantığı vb.
Daniel Auger

71

ASP.NET MVC uygulamasındaki ViewModel, DTO ile aynıdır, ancak MVVM modelindeki ViewModel, DTO'dan farklıdır çünkü MVVM'deki ViewModel davranışlara sahiptir, ancak DTO'da yoktur.


4
Bu güzel bir cevap; detaylarda kısa da olsa.
Phil

5
Asp.net mvc'deki ViewModel neden bir DTO ile aynı olmalıdır? Bu hiç mantıklı değil. Bir ViewModel, DTO olmayan bir davranışa sahip olabilir. Bu, mvc'ye bağlı değildir.
Elisabeth

8
ASP.NET MVC ViewModel ve MVVM ViewModel arasında ayrım yapmak için +1.
Ronald

5
@Elisa - Oldukça eski sorunuzun cevabı, ASP.NET MVC'de, Model ve Görünümü durumsuz bir şekilde değiştirmek için görünümün denetleyicideki Eylemleri (ViewModel değil) çağırmasıdır. Bu nedenle, bir görünüme göre şekillendirilmiş bir DTO, esasen ViewModel ile aynıdır. Bununla birlikte, başka bir serileştirme sınırı olan daha büyük sistemlerde, bir DTO, Görünüm için özel olarak şekillendirilmiş bir ViewModel'den ayrı ise faydalı olabilir.
dansan

27

DTO! = ViewModel

Gelen MVVM desen ViewModel adlı Modeli izole etmek için kullanılır. Modeli temsil etmek için, örneğin NHibernate aracılığıyla bir veritabanına eşlenen basit DTO sınıflarını kullanabilirsiniz . Ama bir DTO olarak modellenen bir ViewModel sınıfı hiç görmedim .. ViewModel sınıfları çoğunlukla DTO'ların sahip olmadığı davranışlara sahiptir.


2
yani DTO'lar sadece yapılar (veya bir yapının yeteneklerini taklit etmesi gereken bir sınıf) olabilir mi?
Max Alexander

20

DTO - Veri Aktarım Nesneleri tam da söylediği gibi veri aktarımı için konteynerlerdir. Hiçbir davranışları yoktur, sadece bir grup kurucu ve alıcı vardır. Bazı insanlar onları değişmez kılar ve mevcut olanları güncellemek yerine gerektiğinde yenilerini oluşturur. Kablo üzerinden aktarıma izin vermek için serileştirilebilir olmaları gerekir.

Genel olarak DTO'lar, uzak bir hizmete yapılan çağrılar pahalı olabileceğinden, bir katmandan diğer katmana verileri işlem sınırları boyunca göndermek için kullanılır, bu nedenle gerekli tüm veriler bir DTO'ya gönderilir ve istemciye bir yığın halinde (kaba taneli) aktarılır.

Bununla birlikte, bazı insanlar ekrana bağlı DTO'lar kavramını kullanır (işlem sınırlarını geçme ile ilgisi yoktur). Yine bunlar gerekli verilerle doldurulur (genellikle belirli bir ekran için gereken veriler ve çeşitli kaynaklardan gelen verilerin bir toplamı olabilir) ve müşteriye gönderilir.

http://blog.jpboodhoo.com/CommentView,guid,21fe23e7-e42c-48d8-8871-86e65bcc9a50.aspx

Daha önce belirtildiği gibi basit durumlarda bu DTO, görünüme bağlanmak için kullanılabilir, ancak daha karmaşık durumlarda bir ViewModel oluşturulmasını ve DTO'dan ViewModel'e verilerin boşaltılmasını gerektirir ki bu açıkça daha fazla iştir (MVVM modelini uygularken) .

Yine daha önce belirtildiği gibi DTO! = ViewModel

ve

DTO ve ViewModel'in yaşamda farklı amaçları vardır


13

İlk olarak, en büyük fark, ViewModel'in DTO'nun Olmaması Gereken davranışlara veya yöntemlere sahip olabilmesidir !!!

İkinci olarak, ASP.NET MVC'de DTO'yu bir ViewModel olarak kullanmak, uygulamanızı DTO ile sıkı bir şekilde birleştirir ve bu, DTO kullanmanın tam tersi bir amaçtır. Bunu yaparsanız, etki alanı Modelinizi veya DTO'nuzu kullanmanın farkı nedir, bir anti-model elde etmek için daha fazla karmaşıklık?

ASP.NET'teki ViewModel, doğrulama için DataAnnotations'ı da kullanabilir.

Aynı DTO, farklı ViewModels Mapping'e sahip olabilir ve One ViewModel, farklı DTO'lardan oluşturulabilir (kompozisyon değil, her zaman nesne haritalama ile). çünkü bir DTO içeren bir ViewModel'e sahipseniz daha da kötü olduğunu düşünüyorum, aynı sorunu yaşayacağız.

Sunum katmanınızdan, DTO'yu bir sözleşme olarak düşünün, uygulamanıza yabancı olduğunu düşünmeniz gereken ve üzerinde herhangi bir kontrolünüz olmayan bir nesne alacaksınız (eski hizmet, dto ve sunum katmanlarına sahip olsanız bile) senindir).

Son olarak, bu temiz ayrımı yaparsanız, geliştiriciler kolaylıkla birlikte çalışabilirler. ViewModel'ları, Görünümleri ve Denetleyicileri tasarlayan kişinin, hizmet katmanı veya DTO uygulaması hakkında endişelenmesine gerek yoktur çünkü diğer geliştiriciler uygulamalarını bitirdiğinde haritalama yapacaktır ... test verileri içeren sunum katmanı.


1
VS 2012'yi kurdum ve oradaki MVC 4 Tek Sayfa Uygulamasına baktım. Örnek projede, DTO'lar WebApi'de denetleyici yöntemleri (veya eylemleri) için parametreler olarak kullanılır. Başka bir deyişle, JSON bu yöntemlere gönderilir ve bazı MVC sihriyle veriler, yöntemlere aktarılmadan önce otomatik olarak DTO'lara dönüştürülür. Bu durumda DTO kullanmanın yanlış olduğunu düşünüyor musunuz? ViewModels bir Web API ile kullanılmalı mı? Daha iyi anlamak istiyorum çünkü hala bu kavramlara o kadar aşina değilim.
Jean-François Beauchamp

Salut Jean-François Beauchamp :) ASP.NET MVC url çocuk arabalarını bir nesneye ayrıştırabilir, örneğin: bu eşlemenin bir Index yöntemine sahip olduğunu varsayalım ajax / index / {jobID} / {ResultsToSkip} / {ResultsToSend} " Controlle Index'te (int jobID, int ResultsToSkip, int ResultsToSend) Index (istek) (istek, 3 alan jobID'yi kapsayan bir nesnedir ...) Yani şimdi params yerine, kapsülleyen nesnelerle uygulamanızla konuşuyorsunuz DATA, yani evet, requestDTO diyebiliriz.Örneğin, api arayüz yöntemlerini değil, yalnızca
DTO'yu

9

Bazı basit görünümler için DTO'umu modellerim olarak kullanacağım, ancak Görünümler daha karmaşık hale geldikçe ViewModel'ler oluşturacağım.

Benim için bu, çabukluk (zaten sahip olduğum için DTO kullanmak) ve esneklik (ViewModellerin oluşturulması endişelerin daha fazla ayrılması demektir) arasında bir dengedir.


2
Güzel pragmatik cevap.
Simon Tewsi

0

DTO'yu ViewModel olarak kullanacaksanız, bu, herhangi bir nedenle DTO'yu değiştirdiğiniz için DTO'ya yüksek bağımlılık yaptığınız anlamına gelir, o zaman bu ViewModel'i etkileyebilir.

DTO kullanın ve görünüm modeline dönüştürün.


-1

DTO kullanabilirizModel sınıfıyla aynıdır ve birden çok model verisini / özelliğini tek bir görünümde göstermemiz / kullanmamız gerektiğinde viewmodel'i kullanabiliriz. Örnek: Önce varlık çerçeve veritabanını kullanarak bir model oluşturuyorum. Yani artık tüm model veritabanına göre üretiliyor. ve şimdi veri açıklamasına ihtiyacımız var, bu veri ek açıklamaları için bir klasör adı DTO oluşturabiliriz, Bu DTO klasöründe, özelliğin üzerine veri ek açıklamasını zaten oluşturan ve ekleyen tüm modelleri tam olarak tutabiliriz. Daha sonra bu DTO sınıflarını kullanarak herhangi bir işlemi (denetleyici, görünümleri kullanın) kullanabiliriz. Ve karmaşık görünüme ihtiyaç duyduğumuzda, yani bir görünümde birden çok sınıf verisine ihtiyacımız olduğunda, burada görünüm modelini kullanabiliriz. Viewmodel için bir klasör adı görünüm modeli oluşturabilir, ardından özel bir sınıf oluşturabilir ve ihtiyacımız olan özelliği koruyabiliriz. Kendimi temizlemeye çalıştım. Herhangi bir öneri çok takdir edildi.

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.