Saya minta maaf untuk pertanyaan yang panjang, ini sedikit berbunyi kata-kata kasar, tapi saya berjanji tidak! Saya telah merangkum pertanyaan saya di bawah
Di dunia MVC, banyak hal langsung. Model memiliki status, View menunjukkan Model, dan Controller melakukan hal - hal ke / dengan Model (pada dasarnya), controller tidak memiliki status. Untuk melakukan hal-hal Controller memiliki beberapa dependensi pada layanan web, repositori, lot. Ketika Anda instantiate controller Anda peduli tentang penyediaan dependensi itu, tidak ada yang lain. Ketika Anda menjalankan suatu tindakan (metode pada Kontroler), Anda menggunakan dependensi itu untuk mengambil atau memperbarui Model atau memanggil beberapa layanan domain lainnya. Jika ada konteks apa pun, katakanlah seperti beberapa pengguna ingin melihat detail item tertentu, Anda meneruskan ID item itu sebagai parameter ke Action. Tidak ada tempat di Controller ada referensi ke negara. Sejauh ini baik.
Masukkan MVVM. Saya suka WPF, saya suka pengikatan data. Saya suka kerangka kerja yang membuat pengikatan data ke ViewModels lebih mudah (menggunakan Caliburn Micro atm). Saya merasa hal-hal yang kurang langsung di dunia ini. Mari kita lakukan latihan lagi: Model memiliki negara, View menunjukkan ViewModel, dan ViewModel melakukan hal-hal untuk / dengan Model (pada dasarnya), ViewModel tidak memiliki negara! (untuk mengklarifikasi; mungkin itu mendelegasikan semua properti ke satu atau lebih Model, tetapi itu berarti ia harus memiliki referensi ke model dengan satu cara atau yang lain, yang merupakan keadaan itu sendiri) Untuk melakukanbarang yang ViewModel memiliki beberapa ketergantungan pada layanan web, repositori, banyak. Ketika Anda instantiate ViewModel Anda peduli tentang penyediaan dependensi tersebut, tetapi juga negara. Dan ini, tuan dan nyonya, mengganggu saya tanpa akhir.
Setiap kali Anda perlu instantiate ProductDetailsViewModel
dari ProductSearchViewModel
(dari mana Anda memanggil ProductSearchWebService
yang pada gilirannya kembali IEnumerable<ProductDTO>
, semua orang masih bersama saya?), Anda dapat melakukan salah satu dari ini:
- panggilan
new ProductDetailsViewModel(productDTO, _shoppingCartWebService /* dependcy */);
, ini buruk, bayangkan 3 dependensi lebih, ini berartiProductSearchViewModel
kebutuhan untuk mengambil dependensi itu juga. Mengubah konstruktor juga menyakitkan. - sebut
_myInjectedProductDetailsViewModelFactory.Create().Initialize(productDTO);
, pabrik hanyalah sebuah Func, mereka mudah dihasilkan oleh sebagian besar kerangka kerja IoC. Saya pikir ini buruk karena metode Init adalah abstraksi yang bocor. Anda juga tidak dapat menggunakan kata kunci hanya baca untuk bidang yang diatur dalam metode Init. Saya yakin ada beberapa alasan lagi. - sebut
_myInjectedProductDetailsViewModelAbstractFactory.Create(productDTO);
So ... ini adalah pola (pabrik abstrak) yang biasanya direkomendasikan untuk masalah jenis ini. Saya pikir itu jenius karena memuaskan keinginan saya untuk mengetik statis, sampai saya benar-benar mulai menggunakannya. Jumlah kode boilerplate saya pikir terlalu banyak (Anda tahu, terlepas dari nama variabel konyol yang saya gunakan). Untuk setiap ViewModel yang membutuhkan parameter runtime Anda akan mendapatkan dua file tambahan (antarmuka pabrik dan implementasi), dan Anda perlu mengetikkan dependensi non-runtime seperti 4 kali tambahan. Dan setiap kali dependensi berubah, Anda juga bisa mengubahnya di pabrik. Rasanya seperti saya bahkan tidak menggunakan wadah DI lagi. (Saya pikir Castle Windsor memiliki beberapa solusi untuk ini [dengan kekurangannya sendiri, koreksi saya jika saya salah]). - lakukan sesuatu dengan jenis atau kamus anonim. Saya suka mengetik statis.
Jadi ya. Mencampuradukkan keadaan dan perilaku dengan cara ini menciptakan masalah yang tidak ada sama sekali di MVC. Dan saya merasa saat ini tidak ada solusi yang cukup memadai untuk masalah ini. Sekarang saya ingin mengamati beberapa hal:
- Orang-orang benar-benar menggunakan MVVM. Jadi mereka tidak peduli dengan semua hal di atas, atau mereka memiliki solusi cemerlang lainnya.
- Saya belum menemukan contoh mendalam MVVM dengan WPF. Sebagai contoh, proyek sampel NDDD sangat membantu saya memahami beberapa konsep DDD. Saya sangat suka jika seseorang bisa mengarahkan saya ke arah yang mirip dengan MVVM / WPF.
- Mungkin saya melakukan kesalahan MVVM dan saya harus membalikkan desain saya. Mungkin saya seharusnya tidak memiliki masalah ini sama sekali. Yah saya tahu orang lain telah mengajukan pertanyaan yang sama jadi saya pikir saya bukan satu-satunya.
Untuk meringkas
- Apakah saya benar menyimpulkan bahwa memiliki ViewModel menjadi titik integrasi untuk kedua negara dan perilaku adalah alasan untuk beberapa kesulitan dengan pola MVVM secara keseluruhan?
- Apakah menggunakan pola abstrak pabrik satu-satunya / cara terbaik untuk instantiate ViewModel dengan cara yang diketik secara statis?
- Apakah ada sesuatu seperti implementasi referensi mendalam yang tersedia?
- Apakah memiliki banyak ViewModels dengan kedua status / perilaku bau desain?