We recently started to build a desktop application with WPF and MVVM.

When we had the need for a validation framework for our view inputs, I started to look on internet to find "de facto" approach for MVVM and WPF in general. There are lots of look-alike methods for validation.

For validation I commonly saw three approaches:

  • Validation Rules on views
  • Hand coded validation on ViewModel setters
  • Using some validation framework attributes (mostly System.ComponentModel.DataAnnotations) on binded Model properties or ViewModel properties.

For validation error user notification, people complain about how WPF lacks old Windows Forms built in Error Provider support and invent their custom ones with IDataErrorInfo interface.

The problems with the implementations I saw so far was they were like toy examples or have overly complex implementations. One implementation outstands for me from the rest.

In Mariano Omar Rodriguez's validation approach, ViewModel decorates its properties with Data Annotations for validation, and to check these attributes are really valid, ViewModel uses some reflection and Linq Expressions. To show errors ViewModel also implements IDataErrorInfo interface. While Mariano's approach seemed a little complex, if I could carry complexity (IDataErrorInfo implementation and reflection methods/properties) to a ViewModelBase class, adding new properties and validations would become fairly easy.

I modified Mariano's code with generics to move all those overhead to a base class. Two things I couldn't carry without friction were IDataErrorInfo's members this[string] indexer and Error property, because these properties send "this" instances to reflective methods for gathering IsValid infos from Data Annotation attributes. I was stuck there for a good solution. My collegue Niyazi came with a solution which suggests we should declare a T type property in ViewModelBase, and use T property instead of "this" in ViewModelBase and actual ViewModels which inherit from ViewModelBase should assign their selves to this generic typed property in their constructors. We were not totally ok with this yet another overhead for the ViewModel. But it's less crappy or less code from other solutions out there. So we settled for this solution.

You can grab the solution attached below. Please feel free to comment on this solution's possible drawbacks.

Samples.Validation.BerkesVariant.rar (83.76 KB)
 
Categories: .NET | C# | In English | MVVM | Teknik | WPF

Başlık herşeyi anlatıyor. Ama söz edilmesi gereken bir kaç değişiklik mevcut tabi ve söz de edilmiş:

Scott Guthrie: Visual Studio 2008 and .NET Framework 3.5 Service Pack 1 Beta
Scott Hanselman: VS2008 and .Net 3.5 SP1 Beta - Should You Fear This Release?
Somasegar's WebLog (MSDN Blogger): Visual Studio 2008 and .NET FX 3.5 SP1 Beta available now

Bir şey eklemek istemiyorum, çünkü eminim MS evanjelistleri onlarca defa aynı şeyi yazmışlardır. ;)

Ekleme:
    (tabii ki) InfoQ: New version of .NET Disguised as a "Service Pack"


 
Categories: .NET | Araçlar | ASP.NET | C# | IDE | Teknik | Visual Studio

A while (or may be a year ago), I blogged about the White Screen of Darn. It came with the Visual Studio 2005 designer, and occurs when for a reason designer couldn't render (generally referenced 3rd party) UI components.

And, it happens again.



With the new Visual Studio 2008 interface also we have a new WSoD error screen :).

The problem shows in a form, when an assembly of a 3rd party UI component directly or indirecly referenced multiple times. As the problematic error message will be like "type Asy1.TypeA couldn't be cast to Asy1.TypeA", this shows us, VS designer wrongly assumes same types as different types.

And here is the resolution: Clean the project, and Build it again.

Then, VS corrects its mistake, and shows designer without errror. ;)



 
Categories: .NET | Araçlar | IDE | In English | Visual Studio

Bir çok tablodan oluşan ve çoklu dil desteği olan bir veritabanında test yapmak için bile olsa veri girmek zor olabilir. Bu tür tablo primary key leri relation sağlamak için boğuşulan durumlarda temel CRUD desteğini hazır veren "scaffolder" lar hayat kurtarıcı olabiliyor.

"Scaffold", kelime itibariyle bina inşaatlarının dışına kurulan yapı iskelesi demek ("temporary framework" olarakta açıklanıyor), ama programlama dünyasına Ruby on Rails ile katılan bir terim. Programcılar için Scaffolding kısaca, veritabanı bağlantısı (sunucu adresi, veritabanı ismi, kullanıcı adı ve şifre) bilgilerinin sağlanması ile sizin adınıza basit veri girişi ve listeleme işlemleri için gerekli kodun üretilmesi anlamına geliyor.

SubSonic aslında "Zero Code DAL" sloganıyla ortaya atılmış ve LINQ'den önce NHibernate yerine geçmeye çalışan bir .NET altenatifi. NHibernate'in yerine geçmekten çok uzak olması ve bazı yaklaşım sorunları olmasına rağmen ( ki bu ileriki bir yazımın konusu olacak) sadece connection string sağlanarak çalışan ve web arayüzüne sahip AutoScaffold özelliği oldukça başarılı.

SubSonic sadece scaffolding sağlamak için tasarlanmamış, dLINQ vari sorgulama ve Active Record tasarım kalıbının bir uygulaması da SubSonic'in yetenekleri arasında.

İleri de SubSonic hakkında daha fazla yazımı okuyabileceksiniz, ancak varmak istediğim nokta farklı bir yerde duruyor, SubSonic için ısınma turları diyelim... ;)
 

Categories: .NET | Araçlar | Yazılım Mimarisi

Evet sonunda Microsoft yıllardır şiddetini arttırarak gelişen MVC (Model-View-Controller) tabanlı web uygulaması geliştirme akımına dayanamayarak kendi ASP.NET için kendi MVC frameworkünü geliştirmeye başlıyor.

Konuyla ilgili ilk açıklama dolaylı şekilde Scott Guthrie tarafından ama kendi blogunda değil de CodeBetter bloggerı Jeffrey Palermo'dan geldi.

Bildiğiniz gibi MVC mimarisiyle tasarlanan web uygulamaları, klasik ASP.NET deki gibi "page controller", değil de "front controller" olarak çalışıyor. Dolayısıyla klasik bir web sayfasına yapılan istekler bir sayfaya değilde, URL'deki adresin eşlendiği sınıf ve içindeki metodlara gerçekleşiyor. Bu bileşen bütün web uygulamasını kontrol eden "controller", web sayfaları sadece asıl işleri olan sunumla ilgileniyor ki bunlara da "view" deniyor. Son olarak "model" ise iş nesneleri ve veriyi simgeliyor.

Microsoft'un bu konuda girişimlerinin olması Microsoft teknolojileri ile benzeri altyapıları yıllardır zaten sağlayan açık kaynak kodlu proje geliştiricileri arasında tartışmalara sebep oldu. Bu tür MVC desteği sağlayan .NET tabanlı en gelişkin denilebilecek proje Castle ve onun MVC ayağı MonoRail'de de durum farklı değil. Jeffrey Palermo'nun postuna yapılan yorumlarda bazı duayen Castle'cıların, Sun'ın kendi community'sine verdiği desteği göstererek, Microsoft'u kendi communitysini desteklemek yerine, onlara rakip olmakla suçladığı bile görüldü. Microsoft'u savunanlar ise, pazarlama stratejisi yüzünden klasik MS müşterilerinin zaten OSS (Open Source Software)'i tercih etmediklerini ve bu saatten sonra da MS'in kalkıp "MVC istiyorsanız bakın OSS'çu arkadaşlar zaten güzel yapmış onları deneyin..." diyemeyeceğini belirtiyor.

MS MVC gelince (ki Orcas'a bile yetişmesi beklenmiyor) ortalığı karıştıracağa benziyor. Zira Castle developer mailing listelerinde yeni çıkacak Castle MVC framework'ü MonoRail 2'nin hangi özellikler taşıyacağı soruları "rakibe" bilgi sızdırmamak için cevapsız kalıyor...


 
Categories: .NET | ASP.NET | Teknik | Yazılım Mimarisi