Uzun soru için özür dilerim, bir rant olarak okur, ama söz veriyorum! Sorularımı aşağıda özetledim
MVC dünyasında işler açıktır. Modelin durumu vardır, Görünüm Modeli gösterir ve Denetleyici , Modelle / Modelle (temelde) bir şeyler yapar , bir denetleyicinin durumu yoktur. Bir şeyler yapmak için Denetleyicinin web hizmetleri, depo, lot üzerinde bazı bağımlılıkları vardır. Bir denetleyiciyi başlatırken, bu bağımlılıkları sağlamayı önemsiyorsunuz, başka bir şey değil. Bir eylem yürüttüğünüzde (Denetleyici'de yöntem), bu bağımlılıkları Modeli almak veya güncellemek veya başka bir etki alanı hizmetini çağırmak için kullanırsınız. Herhangi bir bağlam varsa, örneğin bazı kullanıcılar belirli bir öğenin ayrıntılarını görmek istiyorsa, o öğenin kimliğini Eylem olarak parametre olarak iletirsiniz. Denetleyicinin hiçbir yerinde herhangi bir duruma referans yoktur. Çok uzak çok iyi.
MVVM girin. WPF'yi seviyorum, veri bağlamayı seviyorum. ViewModels'e veri bağlanmasını daha da kolaylaştıran çerçeveleri seviyorum (Caliburn Micro atm kullanarak). Yine de bu dünyada işlerin daha az açık olduğunu hissediyorum. Let tekrar egzersiz yapmak: Model devlet, Görünüm vardır gösterileri ViewModel ve ViewModel yapar Modeli (temelde) ile / konumuna şeyler, bir ViewModel yapar devlet var! için (bir ya da daha Modeller belki delegeler tüm özellikleri, ama bu araçlar kendi içinde durumunu modeli bir yol ya da bir başka, başvuru olmalıdır netleştirmek için) doViewModel, web hizmetleri, depo, lot üzerinde bazı bağımlılıklara sahiptir. Bir ViewModel'i başlattığınızda, bu bağımlılıkları değil, aynı zamanda durumu da sağlamayı önemsersiniz. Ve bu bayanlar ve baylar, beni sonsuza dek rahatsız ediyor.
Eğer bir örneğini için ihtiyaç duyarsan ProductDetailsViewModel
den ProductSearchViewModel
(Kendisinden denilen ProductSearchWebService
sırayla döndü IEnumerable<ProductDTO>
, bu şeylerden biri yapabilir? Benimle hala, herkes):
- diyoruz
new ProductDetailsViewModel(productDTO, _shoppingCartWebService /* dependcy */);
bu vasıtaları, bu kötü, 3 daha bağımlılıkları hayalProductSearchViewModel
bu bağımlılıkları yanı almaya ihtiyaçları. Ayrıca yapıcıyı değiştirmek acı vericidir. - çağrı
_myInjectedProductDetailsViewModelFactory.Create().Initialize(productDTO);
kolayca çoğu IoC çerçeveler tarafından oluşturulan, fabrika sadece Func olduğunu. Bunun kötü olduğunu düşünüyorum çünkü Init yöntemleri sızdıran bir soyutlama. Ayrıca, Init yönteminde ayarlanan alanlar için salt okunur anahtar sözcüğü kullanamazsınız. Eminim birkaç sebep daha var. - Çağrı
_myInjectedProductDetailsViewModelAbstractFactory.Create(productDTO);
Yani ... Bu genellikle bu tür bir sorun için tavsiye edilir desen (soyut fabrika) 'dir. Aslında kullanmaya başlayana kadar statik yazım için özlemimi tatmin ettiğinden beri deha olsa da. Demirbaş kod miktarı çok fazla düşünüyorum (biliyorsun, kullandığım saçma değişken isimleri dışında). Çalışma zamanı parametrelerine ihtiyaç duyan her ViewModel için iki ekstra dosya (fabrika arabirimi ve uygulama) alırsınız ve çalışma zamanı olmayan bağımlılıkları 4 ekstra zaman gibi yazmanız gerekir. Ve bağımlılıklar her değiştiğinde, fabrikada da değiştirirsiniz. Artık DI kabı bile kullanmıyorum gibi geliyor. ( Bence Windsor Kalesi bunun için bir çeşit çözüme sahiptir [kendi dezavantajları varsa, yanılıyorsam beni düzeltin]). - anonim tür veya sözlükle bir şeyler yapın. Statik yazımı seviyorum.
Yani evet. Durum ve davranışı bu şekilde karıştırmak MVC'de hiç var olmayan bir sorun yaratır. Ve şu anda bu sorun için gerçekten yeterli bir çözüm olmadığını hissediyorum. Şimdi bazı şeyleri gözlemlemek istiyorum:
- İnsanlar aslında MVVM kullanıyor. Yani ya yukarıdakilerin hepsini umursamıyorlar ya da başka parlak çözümleri var.
- WPF ile MVVM'nin derinlemesine bir örneğini bulamadım. Örneğin, NDDD örnek projesi bazı DDD kavramlarını anlamama yardımcı oldu. Birisi beni MVVM / WPF için benzer bir şeye yönlendirebilirse gerçekten çok isterim.
- Belki MVVM'yi tamamen yanlış yapıyorum ve tasarımımı tersine çevirmeliyim. Belki de bu problemi yaşamamalıydım. Başkalarının da aynı soruyu sorduğunu biliyorum, bu yüzden sadece ben değilim.
Özetlemek
- ViewModel'in hem durum hem de davranış için bir entegrasyon noktası olması, bir bütün olarak MVVM modeliyle bazı zorlukların nedeni olduğu sonucuna varmak doğru mudur?
- Özet fabrika modelini kullanmak, ViewModel'i statik olarak yazılan bir şekilde başlatmanın tek / en iyi yolu mu?
- Ayrıntılı bir referans uygulaması gibi bir şey var mı?
- Hem durum / davranışa sahip çok sayıda ViewModel sahibi olmak bir tasarım kokusu mu?