ViewModel'i Model ile tamamen aynı şekilde eklemek iyi bir fikir mi?


16

Çözümümde şu katmanlar var:

  1. App.Domain
  2. App.Service
  3. App.Core (belki buna App.DataLayer diyorsunuz)
  4. App.Web

Yazılım tasarım deseni benim sorum değil, aşağıdaki Modeli var Domain

public class Foo {
    public int Id {get;set;}
    public int Name {get;set;}
    public int Value {get;set;}
}

Bu modeli görünümde (örneğin ana sayfa) kullanmak istiyorum VE kullanmak istiyorum Id, Name & Value, bu yüzden ViewModel oluşturmak istiyorsanız, aşağıdakileri ekleyeceğim:

public class FooViewModel {
    public int Id {get;set;}
    public int Name {get;set;}
    public int Value {get;set;}
}

Peki, bu iyi bir fikir mi? ya da sadece Fooyerine kullan FooViewModel?


Bunu anladığımdan emin değilim. Is not Modelgenellikle geçirilen View? Neden tam olarak alanlarını yeniden gerekiyor Modelyılında View? Endişeleri ayrılması bir hedef ise MVCbir ile aynı şeyi yapmak isteyeyim hangi koşullarda, Modelve View? Eğer ViewModelher iki yüzden ikisini oluşturan / uzatarak Modelve View?
null

lütfen @ svidgen'in cevabı hakkındaki yorumları okuyun
Mehdi Dehghani

Ben ilgili bir sorun var - nerede doğrulama (gerekli öznitelik) modelleri (ve veritabanında) devlet belirli değerleri girilmelidir - ancak görünümlerde, bu değerleri olması gerekmez - bu yüzden bazı alanları kopyalamak zorunda kaldım modeller, modeli doğrudan referans almak yerine görünüm modelinde kullanır. Ancak, yansıma üzerine bu muhtemelen iyidir ve farklı amaçlar için oldukları için gerçekten de DRY'yi ihlal etmez (zaten çok kötü değil).
niico

Yanıtlar:


20

Bu başlangıçta KURU kuralının ihlali gibi görünebilir, ancak farklı bir şey yaparsa veya bağımsız olarak değiştirebiliyorsa, "benzer ve hatta özdeş kodun" mutlaka "tekrar" olmadığını iddia ederim. Ve görünüm modelleri söz konusu olduğunda, kod, işletmenin konuştuğu varlık ve işlemleri değil, "müşterinin" gördüklerini tanımlar. Yani, genellikle istemciye veya arayüze "tesadüfen özdeş" modeller ortaya çıkarırsınız. İş kurallarını ve terimlerini veya son kullanıcı terminolojisini birbirinden bağımsız olarak değiştirebilirsiniz.

Bu yüzden soruyu size geri çevirirdim. Etki alanı değişirse, "sürüm 1" istemcilerinin eski arabirimleri kullanmaya devam etmesi kabul edilebilir mi? Arayüzdeki "temel iş kurallarının" parçası olmayan terimleri veya işlemleri açıklayacak mısınız? Ya da tam tersi?

Bu tür sorular aklınızda tutulursa, görüşünüzün "işlevi" kesinlikle temel alan modelini ortaya çıkarmaksa, evet, bu KURU kuralını ihlal ediyor gibi görünüyor.

Ayrıca, model değişiklikleriyle daha doğal olarak değişen bir görünüm ortaya çıkarmanın üye nitelikleri ve yansıması olan bazı dillerde de gerçekleştirilebileceğini unutmayın. (Ya da diğer akıllılık özellikleriyle daha az tekrarla ... Ama, “akıllılık” çoğu zaman sizi kurtardığı tekrarlamayı haklı gösteremez.)


Güzel söz notları (buna oy verin), önceki cevaba yorum olarak söylediğim gibi, genel amaç, görüntüleme hakkında konuşuyorum, belki birkaç gün sonra, yeni alan / özellik eklemeye karar verdim Foo, bu yüzden FooViewModel olarak kullandıysam istemcide de yeni mülk elde edilecek, bu yüzden bu yeni bir güvenlik alanı (izin için doğru / yanlış veya böyle bir şey) olsaydı ne yapmalıyım?
Mehdi Dehghani

@mehdi, hangi alanı eklemeyi düşündüğünüz ve neden görünüp görünmediğini düşündüğünüz konusunda daha spesifik olmanız gerekir. Veya genel olarak, endişe nedir?
svidgen

@mehdi, açık bir şekilde, son kullanıcıların bir güvenlik değerini değiştirmesinden endişe ediyorsanız, alan adınız, kullanıcıların kaydetme yetkisi olmayan şeyleri kaydetmelerine izin vermemelidir
svidgen

Neden ViewModels kullanıyoruz? bildiğimiz gibi, bunlardan biri güvenlik içindir, örneğin, bu alanı güvende tutmak için müşteriye alan User edit formaktarmamız gerekmez IsAdmin, bu yüzden endişeleniyorum. Kötü İngilizcem için üzgünüm.
Mehdi Dehghani

1
Başka bir deyişle, asıl sorunun tam bir soru olduğunu düşünüyorum. Buradaki yorumlarda çözmeye çalıştığınız soru başka bir tam soru. Ve yorumlar iyi, kaliteli cevaplar almanın iyi bir yolu değildir.
svidgen

2

Sadece bir özellik, bir Foo örneği içeren bir görünüm modelim olurdu. Bu şekilde, DRY'yi herhangi bir tanımına göre ihlal etmiyorsunuz, Foo değişirse, görünüm modeliniz otomatik olarak değişikliği görür ve kendinizi görünüm modelinin modele doğrudan bağlanmasından kurtarırsınız.

Yarın görünümün Foo'nun yanı sıra başka bir şey göstermesi gerekiyorsa, sadece yeni bir mülk ekleyebilirsiniz ve görünüm modelinizin amacı hala net olacak, bir Foo ve başka bir şey içeriyor, ilişkili olmayan diğer özelliklerle Foo'nun özelliklerinin bir karışımı.

Görünüm modelinizi bir FooViewModel olarak düşünmezdim, görünümün ne göstermesi gerektiği konusunda düşünürdüm. Yalnızca bir Foo görüntülerse, görünüm modeli bir özellik, bir Foo içerir.

Bunu açık bir şekilde açıkladım mı emin değilim. Değilse, bana bildirin, uyanıkken yeniden denerim!


-2

FooViewModelBu şekilde kullanmanın KURU prensibini ihlal ettiğini söyleyebilirim . Eğer bir değişiklik yapmak gerektiğinde Foosize de bir değişiklik yapmak zorunda FooViewModel. Bence sadece Foogörüşünüz için model olarak daha iyi hizmet edersiniz. Foo ve diğer şeylerden bir şeyler sergilemeniz gerekiyorsa bir görünüm modelini düşünürüm. Örneğin, bazı bilgilerle Foohem de hem de bunlardan bazı bilgiler oluşturmanız gerektiğini varsayalım Bar.


Lütfen söyle, eğer başka bir alan / özellik eklemeye karar verdiysem Foo, bu yüzden Foode ViewModel olarak kullandığım için , bu yeni alanı da görünüme geçirmem gerekiyor, bence bu gerçekten iyi bir anlaşma değil, ne düşünüyorsun ?
Mehdi Dehghani

Görünüm model tarafından maruz bırakılan verilerin sadece bir alt kümesi kullanmak zorunda yanlış bir şey görmüyorum. Bence daha büyük faul Foove arasındaki bağlantıdır FooViewModel. Genel olarak, tek bir mantıksal değişiklik için birden fazla dosyayı değiştirmek iyi bir fikir değildir.
zero_dev

Peki ya bu eklenen alan, true/falseizin için bir değer veya bunun gibi bir şey gibi bir güvenlik alanı ise.
Mehdi Dehghani

Görünümde bu tür alanları göstermeniz gerekmez, ancak yine de kötü niyetli bir kullanıcının böyle bir değişikliği POST yapmaya çalışması durumunda, kodunuzun geri kalanının kullanıcının güvenlik düzeylerini değiştirmesine izin vermediğinden emin olmalısınız.
Graham

Kitlesel atama saldırılarına açık gibi görünüyor
James
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.