Bir model mülk için görünümü bağlamalı mıyız yoksa ViewModel'in kendine ait olması gerekir mi?


21

Aşağıdaki teknik ortamı olan bir projeye başlıyorum: .Net 4.0, Entity Framework 4.0, MVVM Mimarisi ile WPF

İnternette pek çok örnek gördüm, bu ortamda bazı kitaplar. Bazı örneklerde yazarların bu fikri vardı:

  1. Viemodel Model sınıfının bir örneğine sahip olacaktır (Varlık Çerçeve Varlığı, örneğin Kişi)
  2. WPF görünüm denetimlerini Model özelliklerine bağlayın

Bazı yazarlar yaptı:

  1. Viemodel modelin tüm özelliklerini ortaya çıkaracaktır.
  2. WPF view kontrollerini doğrudan modele değil ViewModel özelliklerine bağlayın.

Öyleyse, görünümün, kendi modelini ortaya koymaktan ziyade, modele modelden özellikleri bağlamasına izin vermek iyi bir fikir mi? Veya hangisi daha çok tercih edilir?


Şahsen veri katmanınızı ve mantık katmanlarınızı iyi bir şekilde ayırmak için modelin özelliklerini ortaya çıkarırken buluyorum.
Alex Hope O'Connor,

Yanıtlar:


25

Bir çok programcının ilk önce doğrudan modele bağlanma kısayolunu almaya çalıştığını düşünüyorum, ancak deneyimlerime göre bunun bazı dezavantajları var. Birincil sorun, eğer varlık modeliniz NHibernate ya da benzerleri tarafından ısrar edilirse, Görünüm model özelliğini güncelledikten hemen sonra NHibernate bu değişiklikleri veritabanında kaldırabilir . Bu bir Kaydet / İptal düğmesine sahip düzenleme ekranları için iyi çalışmaz. Aslında, her şeyi bir toplu iş olarak beklemeyi ve sürdürmeyi seçebilir, ancak fikir, modeli değiştirdiğinizde, değişikliğinizi taahhüt ettiğinizdir.

Böylece doğrudan salt okunur ekranlardaki model özelliklerine doğrudan bağlanarak kurtulabilirsiniz, ancak daha sonra bir tutarsızlığa sahip olacaksınız.

Ek olarak, çoğu model uygulanmaz, INotifyPropertyChangedbu nedenle ilk ekrandan sonra ekranın durumu değişirse uygun bağlama hedefleri olmayabilir.

Otomatik özelliklerin kolaylığı göz önüne alındığında, her zaman View'i Model'e değil ViewModel'e bağlamanızı öneririm. Tutarlı, basittir ve gelecekteki değişiklikleri desteklemek için size en fazla esnekliği sağlar.


Cevabını beğendim. Düzenle / Kaydet Ekranından bahsettiğim için +1 .. Ancak, özellikleri bir kez model ve tekrar görünüm modelinde iki kez yazmak zor olacaktır. Aynı zamanda gelişme süresini de arttırır. Bunu yapmanın haklı olduğunu düşünüyor musunuz ...?
Pravin Patil

9
@Pravin Patil - fwiw, her ne zaman bu kısayolu kullandım, geri dönüp düzeltmek zorunda kaldığımda kendime küfür ettim. ViewModel'deki özellikleri, özellikle salt okunursa (otomatik olarak uygulanan özellikleri özel bir ayarlayıcıyla kullanabildiğiniz için) kullanabilmeniz için yeniden uygulamak için nispeten az çaba var. Gerçek şu ki, çoğu durumda Model, ViewModel'den farklı bir veri yapısıdır. Görünümü etkilemeden Modeli değiştirmek için kendinize esneklik bırakın. Görünümü ne kadar az değiştirmek zorunda kalırsanız o kadar iyi, çünkü görünümü test etmek zordur.
Scott Whitlock

4
@Scott Whitlock: İki yıldır NHibernate ile WPF uygulamaları geliştiriyorum ve doğrudan modele bağlayan hiçbir sıkıntı yaşamadım. Aslında, bir model özelliği değiştiğinde, ne için bağlı olursanız olun değişiklik için aynı çaba harcanır. Ve daha sonra ViewModel'in kendisinde bir yönlendirme yapmam gerektiğinde, daha önce ihtiyacım olan zamana yatırım yapmaya değmezdi. YAGNI (henüz) yaklaşımını takip ediyorum ve zorluk çekmiyorum. Bence siz ve buradaki diğerleri bu konuda biraz dogmatik davranıyorsunuz.
Şahin

16

Bir nokta, ViewModelonun bir model olmasıdır View.

Sen bağlayıcı olmalıdır ViewModelüzere View, herhangi bir Model(doğrudan değil, neyse) özelliklerine.


8

Her iki yöntemi de kabul edilebilir buluyorum

Yalnızca ViewModel'e bağlanma "MVVM-purist" yaklaşımıdır ve katmanlar arasında daha iyi ayrılma sağlar. Modele bağlanma genellikle daha hızlı ve daha kolaydır.

Katmanları (projenin büyüklüğü, gelecekteki bakım sorunları, çalıştığım modelin türü vb.) Tamamen ayırmak için iyi bir nedenim olmadığı sürece, Modeli bağlarım.


7

Gördüğünüz şey, bağlama denilen bir kavramdır, yani modelinizde ad adı verilen bir özelliğe sahipse ve görünüm modeliniz bu özelliği ek düzenleme veya dönüştürme yapmadan ortaya çıkarırsa, o zaman modelin içine bağlayabilirsiniz.

Sözde kodu:

 {Binding: MyViewModel.MyModel.Name}

Bu, görünüm modelindeki 'Fluff' özelliklerinin miktarını azaltmak için yapılır, ne yazık ki, aynı zamanda uzun vadede kötü bir fikirdir. Bir görünüm modeli kavramı, görünümün modele bir bağımlılık getirmemesini sağlamaktır. Sizin aracılığınızla bağlayarak şimdi modelinizin ad adlı bir özellik içerdiğinden emin olmalısınız, aksi halde uygulamanız bozulur.

Bununla birlikte, yalnızca görünüm modeline bağlanırsanız, modeli değiştirebilir ve görünüm, yalnızca görünüm modelinde yalnızca Ad adında bir özellik göreceğinden asla bilemez.

Şimdi bu belirli durumlarda hafifletilebilir, modeliniz bir arayüze dayanıyorsa. Bu yüzden, arayüz ModuleName özelliğini gösteren bir IBaseDetails'a sahipse, şunları yapabilirsiniz:

Sözde kodu:

 {Binding: MyViewModel.MyModel.ModuleName}

Yaptığınız Modellerin herhangi biri IBaseDetails arayüzünü tatmin ettiği sürece, altınınız, bunun bir son durum olduğunu ve genel olarak bakış modelinizi kapladığı tüm modellerin etrafına sarmak için her zaman% 90 daha iyi olduğunuzu unutmayın.


2

Model -> ViewModel'den gitmeye çalışırken çok fazla sürtünme görüyorsanız, AutoMapper gibi bir şey deneyin. El ile kopyalama özellikleri ile ilişkili tedium kaldırır.


1

Buraya sadece aynı şüpheye sahip olduğum için geldim ve model yerine her zaman model görmek için bağlanacağım konusunda ikna oldum.

Açısal Reaktif Form yaklaşımını benimseyin. View Modeli'ndeki bazı bilgileri kullanarak bir form grubu oluşturursunuz ancak daha sonra forma erişmeniz gerekir. Değerleri almak ve kopyalamak için değerler modele ne olursa olsun otomatik haritalayıcı veya manuel kullanarak değerler yapar. Örnek olarak, proje modelinin bulunduğu bir proje görüntüleme sayfam var. müşteri adı vb.

Bir proje müşteriye sahip olduğundan, proje ile müşteri arasında bir ilişki vardır. Dolayısıyla bu düzeyde, bu ilişki ile ilgilenmemeliyim, sadece proje adını ve müşteri adını görünüme göstermem gerekiyor, böylece görünüm modeli proje adına ve müşteri adını 2 özellik koydum, böylece görünüm denetimlerini her ikisine de bağladım. daha sonra, modelin hangi yapısından olursa olsun, arkasındaki koddaki bu özelliklere değer vermekten endişe edeceğim.

Aynı şey, kaydetme / iptal durumunda modeli güncellemek için olabilir, daha temiz bir şey yoktur.


Bu yazı okumak oldukça zordur (metin duvarı). Sakıncası var düzenleyebilir daha iyi bir şekle ing?
gnat

İşte, şerefe.
Ivan Carmenates García
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.