MVVM kullanımı hangi şartlar altında uygundur?


47

Model View View-Model, Microsoft tarafından, olay odaklı programlamayı destekleyen UI geliştirme platformlarını, özellikle de Windows platformunda (WPF) ve .NET platformlarında Silverlight'ı XAML ve .NET dillerini kullanan Silverlight'ı hedeflemek için geliştirilmiştir. O zamandan beri, Angular, Knockout ve ExtJS gibi birçok Javascript çerçevesi modeli benimsemiştir.

görüntü tanımını buraya girin

Çoğu yazılım modelinde olduğu gibi MVVM'nin uygun kullanımları ve kötüye kullanımları vardır. MVVM kullanımı hangi şartlar altında uygundur? Ne zaman tavsiye edilmez?


4
Ne yazık ki, gerçek dünyada kesin olarak tanımlanamayan birçok karmaşıklık var. Belli bir noktanın ötesinde, neye bağlı olduğunu söylemek mümkün değildir - her bir özel durum nadir olsa da, olası özel durumların kapsamı sonsuzdur ve gerçekleşene kadar hepsi tespit edilemez. Bir noktada, sadece kalıplar için altta yatan hedeflerin farkında olmanız ve bu hedeflere ne zaman ulaşılamayacağını bilmeniz gerekir. Bunun için de mükemmel bir program yoktur, ancak deneyim yardımcı olur.
Steve314

1
@ Steve314 Bu tartışılabilir. Buna bağlı olduğunu söyleyebilirim: MVVM'nin güzel bir tasarıma girmesine izin vermeyin ve kesinlikle ürününüzü göndermenizi durdurmasına izin vermeyin.
Luke Puplett

@Luke - bu doğru, ancak benim açımdan güzel bir tasarımın ürününüzü gönderirken sizi durdurmasına izin vermemelisiniz. İyi bir tasarım deseni, yalnızca uygun bir şekilde kullandığınız ve gerçek dünya kendiliğinden davrandığı sürece iyidir.
Steve314

@ Steve314 Roger bu.
Luke Puplett

Yanıtlar:


19

MVVM'nin , yüksek kalitede kullanıcı arayüzü kullanan karmaşık kullanıcı etkileşimlerinin gerekli olduğu durumlarda kullanılması amaçlanmıştır (yani WPF ).

MVVM, daha “geleneksel” bir geliştiriciden (örn. İş mantığına yönelik) farklı olan gereksinimleri olan bir kullanıcı deneyimi (UXi) geliştiricisinin bulunduğu modern UI geliştirme platformlarında (Windows Presentation Foundation veya WPF ve Silverlight) hedeflenmiştir. arka uç geliştirme). MVVM View-Model “temelde steroidlerde bir değer dönüştürücü” dür, yani View-Model, veri nesnelerini Modelden bu nesnelerin kolayca yönetilip tüketilebileceği şekilde açığa çıkarmaktan sorumludur. Bu bakımdan, View-Model, View'dan daha Modeldir ve View'un ekran mantığının tümü değilse de en üst düzeyde kullanılır.

MVVM, View katmanındaki neredeyse tüm "kodların arkasını" View katmanından kaldırarak View katman gelişiminin kalıptan geri kalanına ayrılmasını kolaylaştırmak için WPF'deki belirli işlevlerden yararlanmak üzere tasarlanmıştır. İnteraktif Tasarımcıların View kodu yazmasını istemek yerine, yerel WPF biçimlendirme dili XAML'yi kullanabilir ve uygulama geliştiricileri tarafından yazılan ve korunan ViewModel'e ciltler oluşturabilirler. Rollerin bu şekilde ayrılması, Etkileşimli Tasarımcıların programlama veya iş mantığı yerine UX gereksinimlerine odaklanmalarını sağlar ve böylece bir uygulamanın katmanlarının birden fazla iş akışında geliştirilmesine olanak tanır.

Bu tür zengin etkileşime ihtiyaç duyulmadığı UI'ler için MVVM aşırı yüklenebilir; MVP daha doğal bir seçim olabilir. Web uygulamaları için, MVC daha iyi bir seçimdir. Asla daha büyük olmayacak (küçük Winform yardımcı programları gibi) çok küçük uygulamalar için kod ardında yeterlidir.


1
Birkaç yıl hızlı ileri sarılın: Nakavt hakkında ne düşünüyorsunuz? WPF'den geldikten sonra kullandım ve WPF'ye kıyasla ne kadar hafif hissettirdiğini görmek beni şaşırttı ve benim için "fazladan" yönünün çoğunu elimden aldı.
J Trana,

15

Bazen MVVM bir tuzak olabilir. Tecrübelerime göre, daha çok görev odaklı kullanıcı arayüzlerine karşı CRUD benzeri uygulamaları (veri üzerinden formlar) tercih eder. Uygulamadaki arka uç / diğer katmanlar için kötü bir mimari ima ettiğini söylemiyorum ama "DDD ışığı" mimarisiyle gelen çok sayıda MVVM uygulaması gördüm. Nedenini tam olarak bilmiyorum çünkü bağlayıcılık çok kolay ve POCO / Anemic domain nesnelerini kullanarak bir ORM ve MVVM / Binding ile bir uygulama kurmak çok kolay.


10
Bir geliştiricinin hayal gücü eksikliği, kalıpta başarısızlık değildir. Görev odaklı ViewModels oluşturmak oldukça kolaydır.
Sean

6
Bu kısaltmaların bir kısmını genişletmek isteyebilirsiniz.
Roman Reiner

13

MVVM, zayıf tasarlanmış veri bağlama katmanları için bir bant yardımcısıdır. Özellikle WPF / silverlight / WP7 dünyasında, WPF / XAML'deki veri bağlanmasındaki kısıtlamalar nedeniyle çok fazla kullanım görmüştür.

Şu andan itibaren, WPF / XAML hakkında konuştuğumuzu farz edeceğim, çünkü bu her şeyi daha net hale getirecek. MVVM'nin WPF / XAML'de çözmek için belirlediği bazı eksikliklere bakalım.

Veri şekli vs UI şekli

MVVM'deki 'VM', C # 'da tanımlanan ve XAML'de tanımlanan bir dizi sunum nesnesiyle eşlenen bir nesne kümesi oluşturur. Bu C # nesneleri tipik olarak sunum nesnelerindeki DataContext özellikleriyle XAML'ye bağlanır.

Sonuç olarak, viewmodel nesne grafiğinin uygulamanızın sunum nesnesi grafiğiyle eşleşmesi gerekir. Bu, eşleştirmenin birebir olması gerektiğini söylemez, ancak bir liste denetimi bir pencere denetimi içeriyorsa, pencerenin DataContext nesnesinden o listenin verilerini tanımlayan bir nesneye ulaşmanın bir yolu olmalıdır.

Viewmodel nesne grafiği, model nesne grafiğini kullanıcı arabirimi grafik grafiğinden başarıyla ayırır, ancak inşa edilmesi ve bakımı gereken ek bir görünüm modeli katmanı pahasına.

Bazı verileri ekran A'dan ekran B'ye taşımak istersem, görünüm modelleriyle uğraşmam gerekir. Bir iş adamı aklında, bu bir UI değişikliğidir. Bu olmalıdır XAML dünyasında tamamen gerçekleşecek. Ne yazık ki, nadiren olabilir. Daha da kötüsü, görünüm modellerinin nasıl yapılandırıldığına ve verilerin aktif olarak nasıl değiştiğine bağlı olarak, bu değişikliği gerçekleştirmek için oldukça fazla veri yönlendirmesi gerekebilir.

Anlatımsal veri bağlamada çalışmak

WPF / XAML bağlayıcıları yeterince anlamlı değil. Temel olarak bir nesneye ulaşmanın bir yolunu, çaprazlanacak bir özellik yolunu ve data özelliğinin değerini sunum nesnesinin gerektirdiği şekilde uyarlamak için bağlayıcıları sağlarsınız.

C # 'daki bir mülkü ondan daha karmaşık bir şeye bağlamanız gerekiyorsa, temel olarak şansınız kalmaz. Ben doğru / yanlış Görünür / Daralt dönüştürülmüş bir bağlayıcı dönüştürücü olmadan bir WPF uygulaması görmedim. Birçok WPF uygulaması ayrıca, Polarating'i çeviren NegatingVisibilityConverter veya benzeri bir şeye sahip olma eğilimindedir. Bu alarm zilleri çalıyor olmalı.

MVVM, bu sınırlamayı aşmak için kullanılabilecek C # kodunuzu yapılandırmak için size rehberlik eder. Görünüm modelinizde SomeButtonVisibility adlı bir özelliği gösterebilir ve bu düğmenin görünürlüğüne bağlayabilirsiniz. XAML'iniz şimdi hoş ve güzel ... ama kendinizi bir tezgahtar haline getirdiniz - şimdi kullanıcı arabiriminiz gelişirken iki yerde (UI ve C # kodundaki) bağlantıları göstermeniz ve güncellemeniz gerekiyor. Aynı düğmeye başka bir ekranda olmak için ihtiyaç duyuyorsanız, benzer bir özelliği bir görünüm modelinde o ekranın erişebileceği şekilde göstermeniz gerekir. Daha da kötüsü, sadece XAML'a bakamıyorum ve düğmenin artık ne zaman görünür olacağını göremiyorum. Ciltlemeler biraz önemsiz hale gelir gelmez, C # kodunda dedektiflik yapmam gerekiyor.

Verilere erişim agresif bir şekilde kapsamlıdır

Veriler genellikle UI'ya DataContext özellikleriyle girdiğinden, uygulamanız boyunca tutarlı şekilde genel veya oturum verilerini temsil etmek zordur.

"Şu anda oturum açan kullanıcı" fikri harika bir örnektir - bu genellikle uygulamanızın bir örneğinde gerçekten genel bir şeydir. WPF / XAML'de mevcut kullanıcıya tutarlı bir şekilde global erişim sağlamak çok zor.

Yapmak istediğim, şu anda oturum açan kullanıcıya atıfta bulunmak için veri bağlantılarında "CurrentUser" kelimesini özgürce kullanmak. Bunun yerine, her DataContext'in bana geçerli kullanıcı nesnesine ulaşmak için bir yol sağladığından emin olmalıyım . MVVM bunu başarabilir, ancak hepsi bu küresel verilere erişim sağlamak zorunda kaldıklarından, görünüm modları karışıklık yaratacak.

MVVM'nin düştüğü bir örnek

Diyelim ki bir kullanıcı listemiz var. Her kullanıcının yanında, "kullanıcıyı sil" düğmesini görüntülemek istiyoruz, ancak yalnızca oturum açmış kullanıcı bir yönetici ise. Ayrıca, kullanıcıların kendilerini silmelerine izin verilmez.

Model nesneleriniz şu anda oturum açmış olan kullanıcı hakkında bir şey bilmemelidir - yalnızca veritabanınızdaki kullanıcı kayıtlarını temsil ederler, ancak bir şekilde şu anda oturum açmış kullanıcının liste satırlarınızdaki veri bağlantılarına maruz kalması gerekir. MVVM, oturum açmış olan kullanıcıyı o liste satırının temsil ettiği kullanıcı ile birleştiren her liste satırı için bir görünüm modeli nesnesi oluşturmamızı, ardından bu görünüm modeli nesnesine (duygularınıza bağlı olarak "DeleteButtonVisibility" veya "CanDelete" adı verilen bir özellik göstermemizi istiyor. bağlayıcı dönüştürücüler hakkında).

Bu nesne, bir Kullanıcı nesnesi gibi diğer birçok yolla berbat bir şekilde görünecek - tüm kullanıcı modeli nesnesinin özelliklerini yansıtması ve bu veriler değiştikçe güncellemeleri iletmesi gerekebilir. Bu gerçekten çok acayip hissediyor - yine, MVVM sizi bu kullanıcı-çalışma nesnesini korumaya zorlayarak sizi bir katip yapıyor.

Bir düşünün - muhtemelen kullanıcılarınızın özelliklerini bir veritabanında, modelde ve görünümde temsil etmeniz gerekir. Siz ve veritabanınız arasında bir API varsa, daha da kötüsü - veritabanında, API sunucusunda, API istemcisinde, modelde ve görünümde temsil edilirler. Bir mülk her eklendiğinde ya da değiştirildiğinde, dokunulması gereken başka bir katman ekleyen bir tasarım deseni benimsemekte tereddütüm var.

Daha da kötüsü, bu katman veri modelinizin karmaşıklığı ile değil, kullanıcı arayüzünüzün karmaşıklığı ile ölçeklenir. Genellikle, aynı veriler birçok yerde ve kullanıcı arayüzünüzde temsil edilir - bu yalnızca bir katman eklemekle kalmaz, çok fazla yüzey alanı olan bir katman ekler!

İşler nasıl olabilirdi

Yukarıda açıklanan durumda şunu söylemek isterim:

<Button Visibility="{CurrentUser.IsAdmin && CurrentUser.Id != Id}" ... />

CurrentUser benim uygulamamdaki tüm XAML'ye global olarak maruz kalacaktı. Id, liste satırım için DataContext'teki bir özelliğe başvurur. Görünürlük, booleandan otomatik olarak dönüştürülecekti. Id, CurrentUser.IsAdmin, CurrentUser veya CurrentUser.Id güncellemeleri bu düğmenin görünürlüğünde bir güncelleme tetikler. Tereyağından kıl çeker gibi.

Bunun yerine, WPF / XAML, kullanıcılarını tam bir karışıklık yaratmaya zorlar. Söyleyebileceğim kadarıyla, bazı yaratıcı blogcular bu karışıklığa bir isim tokatladı ve bu isim MVVM idi. Kanmayın - GoF tasarım desenleri ile aynı sınıfta değil. Bu çirkin bir veri bağlama sistemi etrafında çalışmak için çirkin bir keskidir.

(Bu yaklaşım, daha fazla okumaya devam etmeniz durumunda bazen "Fonksiyonel Reaktif Programlama" olarak adlandırılır).

Sonuç olarak

WPF / XAML'de çalışmanız gerekiyorsa, hala MVVM'yi önermiyorum.

Kodunuzun, yukarıdaki “örneklerin nasıl olmuş olabileceği” örneğinde olduğu gibi yapılandırılmasını istiyorsunuz; bu, karmaşık veri bağlama ifadeleri + esnek değer zorlamaları ile doğrudan görüntülemeye açık bir model. Bu daha iyi - daha okunaklı, daha yazılabilir ve daha fazla bakım yapılabilir.

MVVM, kodunuzu daha ayrıntılı, daha az bakım gerektirmeyen bir şekilde yapılandırmanızı söyler.

MVVM yerine, iyi bir deneyime yaklaşmanıza yardımcı olacak bazı şeyler oluşturun: Global durumu sürekli olarak UI'nıza göstermek için bir kongre hazırlayın. Kendinizi daha karmaşık ciltleme ifadeleri ifade etmenizi sağlayan ciltleme dönüştürücüleri, Çoklu Ciltleme vb. Yaygın zorlama vakalarını daha az acı verici hale getirmek için kendinize bir bağlayıcı dönüştürücü kitaplığı oluşturun.

Daha da iyisi - XAML'yi daha anlamlı bir şeyle değiştirin. XAML, C # nesnelerini somutlaştırmak için çok basit bir XML formatıdır - daha etkileyici bir değişken bulmak zor olmaz.

Diğer tavsiyem: bu tür uzlaşmalara zorlayan araçlar kullanmayın. Sorun alanınıza odaklanmak yerine, sizi MVVM gibi boka doğru iterek nihai ürününüzün kalitesine zarar vereceklerdir.


23
-1: Bu noktaların çoğu sığdır ve bazı WPF özellikleri kullanılarak sorunların üstesinden gelinebilir. MVP modelinin noktasını tamamen kaçırdığınızı düşünüyorum.
Falcon

14
Örnek: "Burada büyük bir dezavantaj var - veriler çoğu zaman bu şekilde çalışmıyor. Verilerinizin şekli kullanıcı arayüzünüzün şeklinden çok farklı olabilir." Doğru - bu yüzden ilk bakışta ViewModel'e sahipsiniz.
Şahin,

8
Bu biraz fazla FUD tbh. Yani, yeni başlayanlar için, WPF düzeneklerinde bir BooleanToVisibilityConverter var, yani bir tane oluşturmanıza gerek yok. O zaman, örneğin Session'dan gelen statik bilgilere gerçekten bağlanmak istiyorsanız, x: Static'i kullanabilirsiniz. Bazı büyük VM bilgilerine erişmek için RelativeSource gibi şeyleri kullanırsınız. Sonra, şablonlar ve stillerle yapacağınız birçok şey anlattığınız sorunları çözer. O zaman çoklu ciltlemeler yapabilirsiniz. Liste devam ediyor ...
flq

8
Bence sorunun cevabının bir kısmı bu cevapta kaybolmuş ve WPF / SL'de rant olmuş. Bu cevap çoğunlukla, söz konusu modelin sunduğu rolleri ve prensipleri tartışmakla ilgili olmayan özel bir uygulama yaratmanın zorluklarından oluşmaktadır. Ayrıca dürüst olmak gerekirse, bu cevapta bahsedilen birçok şey, sadece MVVM'nin denenmesinin altını çizen teknolojide daha fazla bilgi gerektirir. Bahsedilen sorunların çoğu için çözümler var. ViewModel'in rolü bu cevapta unutulmuş görünüyor.
Kelly Sommers

8
Bu biraz demokrasiye benziyor, en kötü yönetim şekli (elbette önceki tüm formlar hariç), bir nevi ifade. Elbette WPF'nin sorunları var, ama kesinlikle cehennemin dövüşünü aştığı kesin. MVVM özellikli bir WPF, önemsiz bir uygulamadan daha büyük bir şey için MVVM kullanmamaktan kesinlikle daha kolaydır.
Joel Barsotti

8

MVVM'yi gerçekten çok seviyorum ve zorluklarını motive edici buluyorum ve birçok yarar görüyorum, ancak ...

  1. Çok fazla sayıda UI / etkileşim kodu gerektiren uygulamalarda veya oyunlarda mükemmelliği korurken çok sayıda özel davranış eklemek için - biraz kirli MVVM kullanmak daha iyidir - yararlı olduğunda veya aksine veri merkezinde kullanılırken kullanın Kodun etkileşim merkezli alanları. Bir kontrol oluşturmak ve onu farklı ana kontroller arasında taşımak veya başka bir şekilde önbelleğe almak istediğinizi varsayalım.

  2. Oldukça dik bir öğrenme eğrisine sahiptir, bu yüzden zamanınız yoksa, WPF / SL'de çok şey geliştirmeyi planlıyorsanız, Blend konusunda uzman tasarımcılara sahipseniz, kullanıcı arayüzünüz için test kodu yazmanız veya başka bir şekilde yıllarca bakım yapmayı beklemeniz gerekir. proje - işe yaramayabilir.

  3. Pek çok tasarımcı Blend'i tanımıyor, tüm projeler otomatik olarak test katmanına odaklanmaya değmez, çünkü yine de manuel olarak test edilmesi gerekir ve VM'lerinizi test ederek en önemli hataları bu şekilde bulmazsınız.

  4. Bu gerçekten bir yatırım. Önce WPF / SL ve XAML ile ilgili temel bilgileri kavramanız, ardından ciltleme işlemlerini doğru yapmanın yollarını bulmanız, bazı sıralarda vms'ye bağlamanız, doğru komut almanız, çoğu durumda bir çerçeve seçmeniz gerekir. lisanslama nedeniyle sorunlu olun, verimli bir şekilde kodlamak için bir yonga kütüphanesi oluşturun, yalnızca platformun her zaman ciltleme ile iyi çalışmadığını ve ihtiyacınız olanı sağlayan bir davranış kütüphanesi oluşturmaya ihtiyaç duyduğunu görün.

Genel olarak - eğer tüm engelleri aşarsanız ve kalıpta oldukça verimli olursanız - bunların hepsi netlik, bakım kolaylığı ve palavra olarak karşılığını verir. :)


Dik bir öğrenme eğrisi olduğu konusunda aynı fikirde değilim. Bir kişi, bir öğleden sonra MMVM hakkında, onunla üretken olmak için yeterince şey öğrenebilir. Ayrıca, Karışımı bilmek MVVM için bir gereklilik değildir.
Sean

6
@Sean, üzgünüm, üçüncü günümdeyim ve hala mücadele ediyorum :( Belki de iletişim kutularını açma veya seçilen öğeyi modelimden bir ağaç görünümünde ayarlama gibi 'karmaşık' şeyler yapmaya çalışıyorum çünkü ...
Benjol

8

MVVM'de ticari sistemler gibi devasa uygulamalar geliştiren yıllardır bir WPF / Silverlight programcısıyım.

Benim için yıllar geçtikçe, sıkı MVVM'nin zaman yediğini ve paraya mal olduğunu öğrendim. Kesinlikle, "arkasındaki kod yok" gibi kuralları kastediyorum.

En temel biçim / veritabanı uygulamasından başka hiçbir şeyde imkansız değildir.

Tasarımcınız ilk gün standart kontrollerle mümkün olmayan bir şey belirleyeceğinden, MVVM ile çalışırken etkileşim paradigmasını desteklemek için bir dizi özel kontrol oluşturmanız veya mevcut kontrolleri kaydırmanız gerekir.

Her türlü swir UI kontrolünü matematik, atalet, jestler vb. Ve zorlu çalışmalarını kullanarak yazdım.

Ama hepsi bu kodun gerisinde, görünümde değil. Düğme tıklamaları, kaydırma, sürükleme vb. İşlemlerini yapmanız gerekir, ancak bunların hepsi bir şekilde bu kodun gerisinde kalmasını sağlayan bir dizi kontrolde güzelce sarılır.

Sadece hatırına sadece bir dizi kontrol oluşturmak yerine, basitçe görünümün arkasındaki kod arkası ve akıllı UI öğelerini yazmak kolaydır.

MVVM'nin amacı, uygulama / işletme mantığını kullanıcı arayüzü mantığından ayırmaktır. Bağlama sistemi ve MVVM bunu yapmanın güzel bir yoludur.

Bir masadaki XAML tasarımcısı, diğerinde C # programcısı, biri VS'de Blend'de çalışan gibi diğer hedefler yanlıştır.

Bir kullanıcı arabirimini hızlı bir şekilde yeniden tasarlayabilmek başka bir yanlışlıktır. Asla olmaz, erken optimizasyon; Herhangi bir büyük yeniden işleme, modellere bakarak çok fazla çalışmaya ihtiyaç duyar. Tweaking bir şeydir ama hızlı UI revizyonları mümkün değildir; görünüm modelleri etkileşim paradigmasına uymalıdır, bu nedenle kuplaj sizin fark edebileceğinizden daha sıkıdır.

Benim için, uygulama mantığımı ayrı tutmak için MVVM kullanıyorum (genellikle test edilebilir bir kontrol cihazı ve bir takım mantıksız görünüm modelleri kullanıyorum) ancak kullanıcı arayüzümün görünmesini ve seksi bir şekilde hareket etmesini sağlamak için ne gibi kod ve püf noktaları gerekiyorsa yapmam. Terle.

Başka bir deyişle, tasarımlarınızı, harika animasyonlarınızı vb. Yeniden konumlandırmanız yeterlidir, çünkü MVVM'nin nasıl oluşturulacağı fikri çok fazla kafa karıştırıcı olur.

MVVM, hayattaki çoğu şey gibi, iki uç nokta arasında bir yerde tatlı bir noktaya sahiptir .

Yazılım tasarımındaki en önemli şey, ürününüzü erken teslim etmek, hangi özelliklerin kullanıldığını, hangi kullanıcı arayüzünün iyi çalıştığını ve kimsenin kullanmadığı bir ürün için güzel kod yazmamaktır.


7

Uygulamanız, gerçek zamanlı olarak aşırı miktarda veriye bağlamanızı gerektiriyorsa, MVVM aslında işe yarayabilir, çünkü işlemi yavaşlatan soyutlamalar ve şu anda WPF / Silverlight / WP7 hakkında konuştuğumuzu varsayıyoruz. motor şu anda bu kadar verimli değil; gelişmelere rağmen yolda.

MVVM, halihazırda olduğu gibi, denklemin göz önünde bulundurmanız gereken tek kısmı değil. Bağlantısız ViewModels ile iletişim kurmanıza izin vermek için Saf MVVM'nin Mediator deseni gibi altyapı ile desteklenmesi gerekir.

Yukarıdaki kabarcılığa rağmen, MVVM GoF kalıpları doğrultusundadır. Modellere bakarsanız, MVVM, MVVM ile kabaca aynı anda görülen Model Görünümü Pasif Presenter modelinin eşdeğeridir. Burada sık sık insanlar MVVM'nin karmaşıklığından şikayet ederler, çünkü onu nasıl tasarlayacaklarını anlamıyorlar.

MVVM ile ilgili problemler bulduğum bir başka alan da, onu desteklemesi için tasarlanmamış bir üçüncü taraf teknolojisini kullanmanız gerektiği (MS Dynamics için UII çerçevesi gibi). Bazen kendinize, sadece MVVM ile çalışmanın diğer teknolojiyi çevreleyen "hackleme" acısına değip değmeyeceğini sormanız gerekir.

Eğer WPF çözümünüze Win Forms gibi bir şeyi karıştırıyorsanız ve eşleştiriyorsanız, çözümün bu kısmı muhtemelen MVVM için de uygun olmayacaktır. Umarım bu size MVVM'nin uygulanmadığı yerler hakkında bazı fikirler verir.


4

MVVM kullanmak şu durumlarda anlam ifade etmez:

  • WPF veya Silverlight ile çalışmıyorsunuz
  • Bir konsepti test ediyorsun

Bu kadar. WPF / Silverlight ile çalışırken MVVM'yi neden kullanmayacağınızı, ayrı bir projede bir şeyi test etme veya hata ayıklamadığınız sürece gerçekten düşünemiyorum. XAML Bindings'in çalışma şekli nedeniyle WPF / Silverlight gelişimi için ideal tasarım desenini buluyorum.

MVVM'nin asıl amacı, tüm uygulamanızın ViewModels'ınızda çalıştırılmasıdır ve Görüntülemeleriniz, kullanıcıların ViewModels'inizle etkileşimde bulunmak için kullanabileceği hoş bir katmandır. Bir düğmeye tıklamak istiyorsanız, aslında bir ViewModel yöntemi kullanıyorsunuzdur. Sayfayı değiştirmek istiyorsanız, aslında ViewModel'deki CurrentPage özelliğini değiştiriyorsunuz.

Tüm WPF / Silverlight gelişimi için MVVM kullanıyorum, hatta küçük, basit tek sayfalık projeler bile, MVVM'yi kullanmam proje büyüklüğüne ve ihtiyacım olana göre farklı. Bir keresinde MVVM'siz küçük bir uygulama yaptığım için pişmanlık duydum (daha sonra güncelleme eklerken MVVM kullanmak için yeniden düzenlendi)


3

Bir müşteriye MVVM'nin fırlatıp atmaya çalıştığı kodun gerisinde kalmış bir projede biraz çalıştım ve dev bir karışıklık oldu. Bu, kodun arkasındaki tüm projelerin bir karışıklık olduğunu söylemek değildir. Tasarımcılar için sorunlara neden olan görünümler, Blend'in hata yapmasına veya çökmesine neden olur.

RoR ile uğraşmıştım ve ASP.NET Webforms ile bir şeyler yaparken hemen hemen atladım, ancak ASP.NET MVC çıktığında, genellikle ASP.NET MVC'yi Kullanarak olabildiğince öğrenmeye çalıştım. . Her ne kadar farklı bir kalıp olsa da, SL / MVVM gelişiminde In Action kitaplarından öğrendiğim şeylerin çoğunu kullanıyorum.

Silverlight ile çalışmaya başladığımda ne kadar çıplak olduğuna şaşırdım ve onu giydirmek için mevcut birçok çerçeveden birini seçmem gerekiyordu. Bunu MVVM öğrenmekten vazgeçen insanlarla ilgili bir sorun olarak görüyorum.

Mükemmel bir model olan MVVM-Light ile başladım . Daha sonra Caliburn Micro ile çalışmaya başladım ve sonra ışıklar yandı. Bana göre Caliburn Micro , ASP.NET Webforms üzerinden ASP.NET MVC kullanmak gibidir. Bu yüzden, küçük örnek uygulamalar için bile, projeyi yaratıyorum, NuGet CM, çalışıyorum ve çalışıyorum. ViewModel ilk yaklaşımını takip ediyorum ve Görünümlerimi aptal ve Blend'de birlikte çalışmak kolay tutuyorum. VM'leriniz buna katılırsanız test edilebilir ve CM ile karmaşık ekran düzenlerinde dolaşmak oldukça kolaydır.


2

Bu alternatifi kontrol etmenin tadını çıkarabilirsiniz. Bu seçenek, WPF veri bağlama, datatemplates ve MVVM yollarını kaldırır. Bu seçenek daha eski, basit, güvenilir WinForms designer.cs yaklaşımı gibidir.

WPF Kompozitler

http://wpfcomposites.codeplex.com/

Burada, WPF için özlü C # kodu arka ızgara tabanlı kompozitler aracılığıyla UI üstüne basit bir matris bindirilerek üretilir. Modern bir XAML Kullanıcı Arabirimi yalnızca birkaç metin etiketi ve bir fotoğraf listesi kutusu içeriyorsa, bu neden basit kod satırıyla tanımlanamıyor: grid.AddText (guid, x koordinatı, y koordinatı)? Bunun bir tuval üzerinde olmadığını, ancak hala WPF kaplarının içinde olduğunu unutmayın: ızgara, dockpanel, vb. WPF oldukça güçlüdür. Bu yaklaşım yalnızca bunu güçlendirir.

Geliştiriciler genellikle matrisleri ve endeksleri dikkate almazlar. Veri aktarma nesnelerinin (DTO'lar) veya POCO'ların GUID'leri tarafından tanımlanan kaba taneli bir kap düzeyiyle başlayın, ardından bu anahtarlanmış kapları, içindeki potansiyel satır ve sütunların daha ince taneli bir matrisiyle tamamlayın.

Yukarıdaki codeplex projesi, ListBox kontrolünden başlayarak bu yaklaşımı ortaya koyuyor ancak bütün WPF kompozit kontrollerini kapsayacak şekilde genişliyor. Örneğin, her bir liste kutusu bir GUID (bir sınıfa bire bir bağlar) eklenmiş bir bileşiktir, daha sonra bu öğenin içinde alt UI öğelerinin (çocuklar birebir özelliklere bağlandığı bir Izgara) vardır. bir sınıfta) kod arkası yoluyla irade eklenebilir. Çocuklar metin engelleri veya resimler olabilir.

Buradaki fikir, endekslerden ve iyi tanımlanmış bir UI Eleman yapısından (veri sunumu yerine bir PresentationFramework.Aero temalı ListBox'ı temel almak için temel olarak) zorlamaktır. Bu yeni yaklaşım ne yapılabileceğini bilerek sınırlandırıyor, ancak bu sayede üretken sonuçlar kısa ve özlü, sağlam C # kodu ile anlaşılır hale geliyor. Bir kaydırma çubuğunu şekillendirmek için kontrol şablonu çözümleri aramaya veya basit görevler için birden fazla veri şablonu içeren bir çözümü karıştırmaya gerek yok.


-2

MVVM çoğunlukla kullandığım UI çerçevesine dayanmaktadır. Dolayısıyla, bir veri bağlamına bağlanmaya dayanan bir paradigmaya sahip olan WPF veya Silverlight gibi bir şeyle, bu veri bağlamı her zaman bir görünüm modeli olarak adlandırılabilir.

Bu yüzden benim için soru, bu kontrol / pencere / uygulama için görünüm modeli olan büyük bir yağ sınıfını ne zaman inşa edersiniz ve zaten inşa edilmiş nesneleri kullanmaktan ne zaman kurtulabilirsiniz.

Bu yüzden bir soyutlama katmanı eklemek konusunda klasik bir sorumuz var. Sanal Makine bir projeye ağırlık, atalet ve yapı ekleyecektir. İnşa etmeyi kolaylaştıracak, ancak değişmesi daha zor ve inşa etmesi daha uzun sürecektir. Bunların hiçbiri kolayca ölçülebilir.

Ucuz bir cevap için, MVVM komut satırı uygulamaları veya web servisleri için uygun değildir :)

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.