MVVM konusunda tonla İngilizce makale olmasına rağmen Türkçe içeriğin (her zaman ki gibi) eksik olması ve Türkiye'de bilinirliğini arttırmak amacıyla MVVM hakkında bir makale yazmayı düşünüyordum. .NET Framework teknolojileriyle ilgili yazılım geliştiricilere yönelik çıkması planlanlanan ancak çeşitli sebeplerden dolayı iptal edilen bir dergi için aylar önce yazdığım orijinal makalemi bu amaçla düzenleyerek - ve bir blog postu için uzun olduğu için bölerek - sizlerle paylaşıyorum.

1. WPF ile Model View ViewModel: Giriş
2. WPF ile MVVM: Model
3. WPF ile MVVM: View
4. WPF ile MVVM: ViewModel
5. WPF ile MVVM: Parçaları Birleştirmek
Seriye ait kaynak kodlar: MvvmWithWpfSample.rar (245,34 KB)

MVVM daha yenice bir mimari kalıp olduğu için, implementasyonunun nasıl olması gerektiği konusundaki tartışmalar halen devam etmektedir. Özellikle tartışılan ViewModel’in sorumluluklarının ne kadar olması gerektiği yanında, ViewModel’i View’ın DataContext’ine nasıl atanacağı karşımıza çıkar.
Bu konuda üç farklı yaklaşım mevcut:
  1. Önce View (View First) yaklaşımına göre, VM’in parametresiz inşa edici metodu View tarafından çağrılarak WPF tarafından inşa edilir. Bu yaklaşım için bir yol XAML’da ilgili VM’in gösterildiği bir DataContext elementi tanımlanması, bir diğer yol ise (örneğin UserControl için) View’ın DataContext’ine, hiyerarşik olarak daha yukarıdaki bir Vew’ın DataContext’inde bulunan ViewModel’in kullanılarak Bind edilmesidir. Bazıları Önce View yaklaşımı için code behind’a geçip el ile VM oluşturup DataContext’e atar, bu çok raifne bir yöntem olmasa da, VM’i manuel oluşturmak yerine, View’a bir IoC (Inversion of Control) konteynırı tarafından yapıcı metod enjeksiyonu ile VM vererek düzgün sonuçlar alınabilir. Ancak eğer özel IoC konteynırı uzantıları kullanmıyorsanız, enjeksiyonda verilen VM’in nasıl oluştuğu üzerinde kontrolünüz azalacaktır. VM’in yapıcı metodunun büyük ihtimalle parametresiz olması gerekecektir, ki bu da gerçek hayat senaryoları için çok kullanışlı olmayabilir.

  2. Önce ViewModel (ViewModel First) yaklaşımında da birden fazla yöntem vardır. VM oluşturulduktan sonra, yine bir IoC konteynırının vasıtasıyla belirlenmiş bir IView arayüzünü uygulamış nesne referansı alınır ve alınan bu referansın arayüzünde bulunan örneğin SetDataContext gibi bir metodu çağırarak, kendini parametre olarak geçer. Diğer bir yöntem ise “Typed DataTemplate” kullanmaktır. İlk olarak ResourceDictionary dosyasında ViewModel tipinin kullanacağı DataTemplate içinde View tipi deklare edilir. İkinci adımda View’da bulunan bir ItemsControl’un ItemSource özelliğine ViewModel’in kendisi Binding nesnesi olarak atanır. WPF, bağlı nesnelerin birinci adımda anlatıldığı gibi bir DataTemplate’e sahip olup olmadığını kontrol eder ve eğer mevcutsa bu nesnelerin ait olduğu View’ları varsayılan parametresiz inşa edici metodunu çağırarak oluşturur.

  3. Bazılarının Evlilik, bazılarının ise Controller şeklinde adlandırdığı son yaklaşımda, View ve VM dışında 3. bir bileşen, View ve VM’in örneğini alarak View’ın DataContext’ine VM’i atar. Biz demo uygulamamızda basitliği ve demomuz tek ekrandan meydana geldiği için bu yöntemi tercih ettik.


MVVM Hakkında Kısa İpuçları

  • ViewModel özelliklerine PropertyChanged event’i dışında başka metodları tetikleyecek kod yazmaktan kaçının. Bir senaryo için yapacaklarınız doğru iken, diğer senaryolarda VM özelliği tahmininiz dışında hareket ediyor olabilir.

  • Uygulamalarda çoğunlukla, Model’deki özellikleri VM üzerinde ayrı ayrı tanımlamak yerine, örneğin Customer gibi bir nesneyi VM’de tutmak ve bunun Name, Surname gibi özelliklerine de View’ın, Model üzerinden erişmesi tercih edilir. Böyle bir durumda model sınıfları INotifyPropertyChanged arayüzünü uygularlar ve model üzerinde yer alan koleksiyonlar da List, Set yerine ObservableCollection olmalıdır.

  • View ihtiyaçları yüzünden Model koleksiyonlarınızda kullandığınız Model sonıflarına “IsChecked” gibi alanlar ekliyorsanız, MVVM kalıbını bozuyorsunuz demektir. Bu tür özellikler tanımlamak yerine daha ayrıntılı VM’ler oluşturun.

Özet ve Bahsedilmeyenler

Makale serimizde WPF, MVVM’in temeli olan üç bileşen M-V

 

-VM
, aralarındaki ilişki, INotifyPropertyChanged, Command’lar gibi bir çok konuya değindik.

Konunun yeniliği sebebiyle MVVM üzerinde tartışılan bir çok yanı mevcut. Örneğin MVVM’de sıkça kullanılan ve bir EventAggregator (Fowler) uygulaması olan  Mediator-Mesenger konusunu incelemenizi öneririm. Önce View ve Önce ViewModel konularına da umarım ileriki yazılarımızda daha geniş girebiliriz, bu iki yöntemi nasıl uygulandığı Blendability’yi oldukça etkilemektedir. Tabi değinmediğimiz bir diğer konu da MVVM’in bize sağladığı faydalardan olan test edilebilirliğin uygumalarıdır. Bunları sonra yazmayı planladığım makalelerde bu konulara değinmeyi düşünüyorum.

Makale serimiz (şimdilik) burada sona eriyor. Birlikte MVVM projeleri üzerinde çalışırken görüş alışverişi yaptığımız Niyazi Toytok, Ali Bülbül ile Ömer Kul’a ve makaleleri gözden geçiren Doğan Akhan’a  teşekkür ederim. Okuduğunuz için de sizlere teşekkür ederim. MVVM ile ilgili her türlü sorunuzu mail ile bana iletebilirsiniz: berkesokhan et cimeyl dat kom   \m/ (*_*) \m/

 

Add comment




  Country flag
biuquote
  • Comment
  • Preview
Loading