Caliburn.Micro'da Convention: View ile ViewModel nasıl eşleşiyor?
Bir serinin üçüncü yazısı, Caliburn.Micro'nun Convention (uzlaşma/kural) yaklaşımını ele alıyor: View ile ViewModel'in isim kuralları ve reflection üzerinden otomatik eşleştirilmesi. ViewLocator'ın çalışma adımları, NameTransformer'ın varsayılan beş regex kuralı ve AssemblySource'un neden önemli olduğu anlatılıyor.
Kilit noktalar
- ViewLocator, ViewModel örneği ya da tipi alıp ilgili View'ı döndüren `LocateForModel` ve `LocateForModelType` Func'larını sunar.
- Eşleştirme iki adımda ilerler: tip çıkarımı ve `Activator.CreateInstance` ile reflection tabanlı oluşturma.
- `IViewAware` uygulayan ViewModel, View'ı önbelleğe alabilir; ViewLocator önce önbelleğe bakar.
- NameTransformer varsayılan olarak beş kural getirir ve `ViewModels` → `Views` klasör ayrımını da kapsar.
- AssemblySource tarama alanını belirler; plugin gibi ayrı assembly'lerdeki View'lar `SelectAssemblies` ile eklenmeli.
- Otomatik eşleştirmeyi tamamen atlayıp View ve ViewModel'i elle oluşturup `ViewModelBinder.Bind` ile bağlamak mümkün.
MVVM'de ViewModel'e önerilen yaklaşım ViewModel-First: önce ViewModel tasarlanır, View bir DataTemplate ile üretilir ya da çalışma anında bulunur. Caliburn.Micro bu işi ViewLocator ile yapar; `LocateForModel` ve `LocateForModelType` gibi Func tabanlı override'lar verilen ViewModel örneği veya tipi için ilgili View'ı döndürür. İşlem iki adımdır: önce ViewModel tipinden View tipi çıkarılır, sonra View `Activator.CreateInstance` ile reflection üzerinden oluşturulur. ViewModel `IViewAware` uyguluyorsa ve daha önce bir View önbelleğe alınmışsa yeni nesne üretilmez, mevcut View döndürülür.
Tip çıkarımı NameTransformer'ın regex kurallarıyla yapılır: `ReplacePattern` ve `ReplaceValue` ile örneğin son ekteki ViewModel, View ile değiştirilir; sonuçta `ShellViewModel` → `ShellView` olur. Gelen beş varsayılan kural, ViewModels → Views klasör düzenini de kapsar. Çıkan değer bir string olduğundan ikinci aşamada AssemblySource'taki assembly'lerde aranır; AppDomain taranmadığı için plugin gibi ayrı assembly'lerdeki View'ları `SelectAssemblies` override'ı ya da AssemblySource'un Add/AddRange metotlarıyla kapsama almak gerekir.
Gerçek dünyada kullanımı
- MVVM tabanlı bir WPF masaüstü uygulamasında ViewModels ve Views klasörlerini ayırıp View'ları elle new'lemeden çözmek isteyen ekipler.
- DirectoryCatalog ile plugin yükleyen ve plugin içindeki View'ların da otomatik bulunmasını isteyen bir uygulama.
- Caliburn.Micro'dan başka bir MVVM framework'üne geçişte mevcut isimlendirme kurallarının nasıl çalıştığını anlamak isteyen geliştiriciler.
Neden önemli
Caliburn.Micro'nun otomatik eşleştirmesi ancak isimlendirme ve assembly kapsamı doğruysa çalışır; yanlış isim ya da eksik AssemblySource kaydı, çalışma anında View bulunamadı hatası olarak karşınıza çıkar.
Benzer haberler
- C# 14 extension member'ları: derleyicinin uyarmadığı gölgeleme hatasıDEV Community: #csharp1 gün önce
- Ollama ve Qdrant ile C# tarafında yerel RAG'den AI Agent'a – Bölüm 3Ottorino Bruni1 gün önce
- C#'ta LLM token'ları: yapay zekâ "strawberry"deki r'leri neden sayamıyor?DEV Community: #csharp1 gün önce