ฉันขอโทษสำหรับคำถามยาว ๆ มันอ่านได้เล็กน้อยว่าเป็นคำโหยหวน แต่ฉันสัญญาว่ามันจะไม่! ฉันได้สรุปคำถามของฉันด้านล่าง
ในโลกของ MVC สิ่งต่าง ๆ ตรงไปตรงมา รูปแบบมีสถานะมุมมองแสดงรูปแบบและตัวควบคุมทำสิ่งต่าง ๆ เพื่อ / กับรุ่น (โดยทั่วไป) ตัวควบคุมไม่มีสถานะ ในการทำสิ่งต่าง ๆ ที่คอนโทรลเลอร์มีการขึ้นต่อกันของบริการบนเว็บ, ที่เก็บ, ล็อต เมื่อคุณยกตัวอย่างคอนโทรลเลอร์ที่คุณสนใจเกี่ยวกับการจัดหาการพึ่งพาเหล่านั้นไม่มีอะไรอื่น เมื่อคุณเรียกใช้การกระทำ (เมธอดบนตัวควบคุม) คุณใช้การอ้างอิงเหล่านั้นเพื่อดึงหรืออัปเดตโมเดลหรือเรียกบริการโดเมนอื่น ๆ หากมีบริบทใด ๆ ให้พูดเช่นผู้ใช้บางคนต้องการดูรายละเอียดของรายการใดรายการหนึ่งคุณจะส่ง Id ของรายการนั้นเป็นพารามิเตอร์ไปยัง Action ไม่มีที่ใดในคอนโทรลเลอร์มีการอ้างอิงถึงสถานะใด ๆ จนถึงตอนนี้ดีมาก
ป้อน MVVM ฉันรัก WPF ฉันรักการผูกข้อมูล ฉันรักเฟรมเวิร์กที่ทำให้การผูกข้อมูลกับ ViewModels ง่ายยิ่งขึ้น (โดยใช้ Caliburn Micro atm) ฉันรู้สึกว่าสิ่งต่าง ๆ ตรงไปตรงมาน้อยในโลกนี้แม้ว่า ลองทำแบบฝึกหัดอีกครั้ง: Model มีสถานะวิวจะแสดง ViewModel และ ViewModel จะทำสิ่งต่าง ๆ ให้กับ / กับ Model (โดยทั่วไป) ViewModel จะมีสถานะ! (เพื่อชี้แจง; บางทีมันอาจจะได้รับมอบหมายคุณสมบัติทั้งหมดที่หนึ่งหรือมากกว่าหนึ่งรุ่น แต่นั่นหมายความว่าจะต้องมีการอ้างอิงถึงรูปแบบหรืออีกวิธีหนึ่งซึ่งเป็นของรัฐในตัวเอง) ในการทำสิ่งที่ ViewModel มีขึ้นอยู่กับการให้บริการของเว็บพื้นที่เก็บข้อมูลจำนวนมาก เมื่อคุณสร้างอินสแตนซ์ ViewModel ให้คุณสนใจเกี่ยวกับการจัดหาการพึ่งพาเหล่านั้น แต่ยังรวมถึงสถานะด้วย และนี่คือสุภาพสตรีและสุภาพบุรุษทำให้ฉันรำคาญใจไม่สิ้นสุด
เมื่อใดก็ตามที่คุณต้องการยกตัวอย่างProductDetailsViewModel
จากProductSearchViewModel
(จากสิ่งที่คุณเรียกว่าสิ่งProductSearchWebService
ที่กลับมาIEnumerable<ProductDTO>
ทุกคนยังคงอยู่กับฉัน) คุณสามารถทำสิ่งใดสิ่งหนึ่งต่อไปนี้:
- โทร
new ProductDetailsViewModel(productDTO, _shoppingCartWebService /* dependcy */);
นี่มันไม่ดีลองนึกภาพการขึ้นต่อกันอีก 3 ครั้งนั่นหมายถึงProductSearchViewModel
ความจำเป็นในการพึ่งพาเหล่านั้นเช่นกัน การเปลี่ยนคอนสตรัคเตอร์ก็เจ็บปวดเช่นกัน - โทร
_myInjectedProductDetailsViewModelFactory.Create().Initialize(productDTO);
โรงงานเป็นเพียง Func พวกเขาสร้างขึ้นได้อย่างง่ายดายโดยกรอบ IoC ส่วนใหญ่ ฉันคิดว่ามันไม่ดีเพราะวิธีการเริ่มต้นเป็นสิ่งที่เป็นนามธรรมรั่วไหล คุณไม่สามารถใช้คำหลักแบบอ่านอย่างเดียวสำหรับเขตข้อมูลที่ตั้งค่าในวิธีการเริ่มต้น ฉันแน่ใจว่ามีเหตุผลอีกสองสามข้อ - โทร
_myInjectedProductDetailsViewModelAbstractFactory.Create(productDTO);
ดังนั้น ... นี่คือรูปแบบ (โรงงานนามธรรม) ที่มักจะแนะนำสำหรับปัญหาประเภทนี้ ฉันแม้ว่ามันจะเป็นอัจฉริยะเพราะมันสนองความอยากของฉันในการพิมพ์แบบคงที่จนกว่าฉันจะเริ่มใช้มัน จำนวนรหัส boilerplate คือฉันคิดว่ามากเกินไป (คุณรู้นอกเหนือจากชื่อตัวแปรไร้สาระที่ฉันได้ใช้) สำหรับ ViewModel แต่ละตัวที่ต้องการพารามิเตอร์แบบรันไทม์คุณจะได้รับไฟล์เพิ่มเติมสองไฟล์ (ส่วนต่อประสานจากโรงงานและการนำไปใช้งาน) และคุณต้องพิมพ์การขึ้นต่อแบบไม่ใช้งานจริงเช่น 4 ครั้งเพิ่มเติม และทุกครั้งที่มีการเปลี่ยนแปลงการพึ่งพาคุณจะได้รับการเปลี่ยนแปลงในโรงงานเช่นกัน รู้สึกเหมือนฉันไม่ได้ใช้ DI container อีกต่อไป (ฉันคิดว่า Castle Windsor มีวิธีแก้ปัญหาบางอย่างสำหรับเรื่องนี้ [ด้วยข้อเสียของตัวเองแก้ไขฉันถ้าฉันผิด]) - ทำอะไรกับประเภทหรือพจนานุกรมที่ไม่ระบุชื่อ ฉันชอบการพิมพ์แบบคงที่ของฉัน
ดังนั้นใช่ การผสมสถานะและพฤติกรรมในลักษณะนี้จะสร้างปัญหาที่ไม่มีอยู่ใน MVC และฉันรู้สึกว่าในปัจจุบันยังไม่มีวิธีแก้ปัญหาที่เพียงพอสำหรับปัญหานี้ ตอนนี้ฉันต้องการสังเกตบางสิ่ง:
- ผู้คนใช้ MVVM จริง ดังนั้นพวกเขาจึงไม่สนใจทั้งหมดข้างต้นหรือมีวิธีแก้ปัญหาอื่นที่ยอดเยี่ยม
- ฉันไม่พบตัวอย่างเชิงลึกของ MVVM ด้วย WPF ตัวอย่างเช่นโครงการตัวอย่าง NDDD ช่วยฉันอย่างมากในการทำความเข้าใจแนวคิด DDD บางอย่าง ฉันชอบมันมากถ้ามีคนชี้ให้ฉันเห็นทิศทางของสิ่งที่คล้ายกันกับ MVVM / WPF
- บางทีฉันอาจทำผิดพลาด MVVM และฉันควรพลิกการออกแบบของฉันให้คว่ำ บางทีฉันไม่ควรมีปัญหานี้เลย ฉันรู้ว่าคนอื่นถามคำถามเดียวกันดังนั้นฉันคิดว่าฉันไม่ใช่คนเดียว
เพื่อสรุป
- ฉันถูกต้องหรือไม่ที่จะสรุปว่าการมี ViewModel เป็นจุดรวมสำหรับทั้งรัฐและพฤติกรรมเป็นสาเหตุของปัญหาบางอย่างกับรูปแบบ MVVM โดยรวมหรือไม่?
- การใช้รูปแบบนามธรรมจากโรงงานเป็นวิธีเดียวที่ดีที่สุดในการสร้างอินสแตนซ์ ViewModel ด้วยวิธีการพิมพ์แบบคงที่หรือไม่
- มีบางอย่างเช่นการใช้การอ้างอิงเชิงลึกหรือไม่
- การมี ViewModels จำนวนมากที่มีทั้งสภาวะ / พฤติกรรมมีกลิ่นของการออกแบบหรือไม่?