WPF ile MVVM: Model (MVVM-2)

November 26, 2010

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)

Model bileşenleri, diğer bir çok mimari tasarım kalıbında olduğu gibi, iş mantığı veya bunlara ait servislerin bulunduğu bileşenlerdir.

Monolitik bir uygulamada domain nesneleri, validasyon ve domain servisleri bu katmanda yer alır. Bu katmandan aşağı doğru veritabanı sorgu ve komutları gider.

Dağıtık bir uygulamada ise, genellikle bir uygulama sunucusuna yapılan web servis veya remoting gibi çağrıları yöneten servis sınıfları, validasyon sınıfları ve uygulama sunucusuna yapılan çağrıları ve cevapları taşıyan mesaj bileşenleri olan Veri İletim Nesneleri (Data Transfer Object – DTO’lar)  yer alır. Eğer klasik ASP.NET 2.0 Web Servisleri çağrılarak uygulama sunucusuyla iletişim kuruluyorsa, Visual Studio ile verilen referens sonucu otomatik üretilen web servis vekil (proxy) sınıflarının model sınıfı olarak kullanılması tavsiye edilmez. İleride bahsedeceğimiz ve WPF ile kurulan MVVM tasarım kalıbının önemli (ve belki de en rahatsız edici?) öğelerinden biri olan INotifyPropertyChanged arayüzünün modelde bulunan veri sınıfları tarafından uygulanması gerekebilir. Bu durumda, üzerinde kontrolümüz olmayan Visual Studio tarafından üretilmiş sınıfları kullanmak yerine, kendi istemci tarafı model sınıflarımızı oluşturmamız gerekecektir. Klasik ASP.NET web servisleri yerine, Windows Communication Foundation (WCF) altyapısıyla hazırlanan servisler kullanarak modelimizi oluşturursak istemci tarafında, uygulama sunucusunda oluşturulan mesaj kütüphanesini (DTO’ları, birer WCF Servis Kütüphanesi projesinde tanımlayarak) aynen kullanabiliriz. Bu yöntemin avantajı istemci tarafında model için DTO->model nesne eşleştirmesine sahip olmadan kullanmak olacaktır. Kabul edilebilir bir tasarım sorunu ise sunucu tarafındaki bu DTO’larda istemcinin ihtiyaç duyacağı INotifyPropertyChanged arayüzünün uygulanması, yani istemci ile ilintili kaygıların sunucuya sızmasına olanak verilmesidir.

Diagram 2’de makalemizde kullanmak için oluşturduğumuz örnek bir model mevcuttur.

Örnek Modelimiz

Görüldüğü gibi model sınıflarımız bildiğimiz POCO’lardan (Plain Old CLR Object) oluşmaktadır. Bu POCO’ları yukarıda tartıştığımız gibi, ister ASP.NET servis referansı sonucu üretilen DTO’lardan nesne eşleştirmesi ile (örneğin AutoMapper kullanarak), isterseniz WCF ile hem sunucu hem de istemcide ortak kullanarak ve DataContract betimlemeleriyle oluşturabilirsiniz. Model, basit ve anlaşılır olmak amacıyla, bilindik senaryo olan müşteri bilgisi senaryosunu tasvir edecek şekilde tasarlandı. Müşterinin kişisel bilgilerini, adresini, şehir ve telefon bilgilerini içeren (Diagram-1) modelin anemik olması gözünüze çarpmış olabilir. Bunun birinci sebebi, MVVM için modelin diğer M içeren kalıplardan pek farklı olmamasıdır, dolayısıyla üzerinde fazla durmayacağımız basit bir tasarım yeterlidir. İkinci sebep ise istemci-sunucu tarzı bir mimaride DTO kullanılacağını varsayarsak istemci tarafındaki model nesnelerinizin elle tutulur bir miktarda iş mantığı içermemesi gerekmesidir. Model üzerinde yapacağımız operasyonları View ve VM konularında anlatacağız.


Pingbacks and trackbacks (4)+

Add comment




  Country flag
biuquote
  • Comment
  • Preview
Loading