การเปรียบเทียบ Asp.net (MVC) และ WPF (MVVM) - มีการผูกข้อมูลเทียบเท่าหรือไม่

ฉันกำลังพิจารณาการเปลี่ยนแบบฟอร์ม WPF (mvvm) เป็น asp.net (MVC) ฉันคิดว่ามันอาจจะมีประโยชน์สำหรับความมีสติในการเปรียบเทียบ asp.net(MVC) และ WPF(MVVM)

MVC ที่เทียบเท่ากับตัวอย่าง WPF ต่อไปนี้จะมีลักษณะอย่างไร โดยเจาะจง ฉันสงสัยว่าจะรักษาการแยก UI และตรรกะของแอปพลิเคชันอย่างไร และอาจสำคัญกว่านั้น หากมีการเชื่อมโยงข้อมูลที่เทียบเท่ากัน รูปแบบการออกแบบทั้งสองที่แตกต่างกันจะบรรลุผลสำเร็จในสถานการณ์เดียวกันได้อย่างไร

มุมมองโมเดล

ในโมเดลมุมมองของคุณ คุณจะมีคลาสที่ส่วนประกอบในมุมมองจะเชื่อมโยงด้วย บางสิ่งบางอย่างตาม:

namespace solution.ViewModels
{
    public class MainViewModel : BaseViewModel
    {
        private DateTime _fromDate;

        public DateTime FromDate
        {
            get { return _fromDate; }
            set { _fromDate = value; OnPropertyChanged("FromDate"); }
        }

        private DateTime _toDate;

        public DateTime ToDate
        {
            get { return _toDate; }
            set { _toDate = value; OnPropertyChanged("ToDate");}
        }
    }
}

โดยที่ BaseViewModel อยู่ที่ไหน:

public class BaseViewModel : INotifyPropertyChanged
{
    public event PropertyChangedEventHandler PropertyChanged;

    protected void OnPropertyChanged(string propertyName)
    {
        if (PropertyChanged != null)
        {
            PropertyChanged(this, new PropertyChangedEventArgs(propertyName));
        }
    }
}

ดู

<Window .......>
    <Grid>
       <DatePicker SelectedDate = "{Binding ToDate}">
       <DatePicker SelectedDate = "{Binding FromDate}">
    </Grid>
</Window>

person LCaraway    schedule 15.02.2017    source แหล่งที่มา
comment
การเปรียบเทียบเว็บแอป MVC กับแอปเดสก์ท็อป WPF ก็เหมือนกับการเปรียบเทียบแอปเปิ้ลกับรถยนต์ อย่าทำผิดพลาดในการพยายามพอร์ตมัน ลืมสิ่งที่คุณทำไปแล้วและเริ่มต้นใหม่   -  person Peter Bons    schedule 16.02.2017
comment
นั่นยุติธรรมแล้ว และท้ายที่สุดแล้วสิ่งที่ฉันมีอยู่ในใจ ยังคงหวังว่าจะเริ่มการอภิปรายว่าการออกแบบที่แตกต่างกันจะบรรลุเป้าหมายเดียวกันได้อย่างไร   -  person LCaraway    schedule 16.02.2017
comment
ฉันขอแนะนำให้คุณดูที่ knockoutjs.com มันเป็นเฟรมเวิร์กในการพัฒนา Javascript UI โดยใช้รูปแบบ MVVM   -  person Martino Bordin    schedule 16.02.2017
comment
ฉันทำทั้งตัวเองและสิ่งเดียวที่คล้ายคลึงกันระหว่างสองรูปแบบคือในหน้าเว็บที่ต้องอาศัยคำขอ ajax อย่างมากเพื่อจัดการสิ่งต่าง ๆ ที่ผู้ใช้กำลังทำใน UI การใช้ javascript MVVM เช่น knockoutjs ดังที่ @MartinoBordin กล่าวถึงนั้นมีประโยชน์มาก . พวกเขาจะดูแลการอัปเดต UI ‹--› จาวาสคริปต์ที่ยุ่งยากทั้งหมดให้กับคุณ เช่นเดียวกับที่ Bindings ทำใน WPF   -  person    schedule 16.02.2017


คำตอบ (2)


ฉันคิดว่าความคิดเห็นบางส่วนเกี่ยวกับคำถามนี้จนถึงตอนนี้ยังไม่ยุติธรรมเลย...ใช่ เทคโนโลยีทั้งสอง (ASP.Net MVC และ WPF) ถูกนำมาใช้เพื่อสร้างสำหรับแพลตฟอร์มที่แตกต่างกันโดยสิ้นเชิง แต่มีการเปรียบเทียบที่สามารถทำได้ระหว่างสถาปัตยกรรม (MVC และ MVVM) ถูกใช้ในแต่ละแพลตฟอร์มเหล่านั้น

ใน WPF คุณมี ViewModel ที่เปิดเผย โมเดล ของคุณไปยัง View ของคุณ ในตัวอย่างของคุณ MainViewModel แสดงโมเดลที่มีตั้งแต่และถึงวันที่ผ่านคุณสมบัติ FromDate และ ToDate มุมมองสามารถเลือกที่จะแสดงค่าเหล่านั้นได้ตามต้องการ

ใน ASP.Net MVC คุณยังคงมี Model และ View และสิ่งที่เชื่อมต่อทั้งสองอย่าง - Controller การดำเนินการที่เรียกใช้บนคอนโทรลเลอร์ของคุณโดยคำขอ HTTP บางรายการมีหน้าที่รับผิดชอบในการเติมโมเดลที่จะแสดงผลโดยมุมมองและส่งคืนไปยังไคลเอ็นต์เป็นการตอบกลับ HTTP

public class MainController : Controller
{
  public ActionResult ShowMeTheModel()
  {
    SimpleModel model = new SimpleModel
    {
      FromDate = DateTime.Today,
      ToDate = DateTime.Today.AddDays(7)
    };

    return View(model);
  }

  [HttpPost]
  public ActionResult UpdateTheModel(SimpleModel model)
  {
    // use the model parameter to persist changes or otherwise        

    return Redirect("ShowMeAllTheModels");
  }
}

และมุมมองพื้นฐาน

<h2>A Simple Model</h2>

<% using(Html.BeginForm("UpdateTheModel", "Main")) %>
<% { %>

  <table>
    <tr>
      <th>From Date</th>
      <th>To Date</th>
    </tr>
    <tr>
      <td>
        <%= Html.DatePickerFor(model => model.FromDate) %>
      </td>
      <td>
        <%= Html.DatePickerFor(model => model.ToDate) %>
      </td>
    </tr>
  </table>
<% } %>

การเชื่อมโยงข้อมูลเกิดขึ้นในโพสต์ด้านหลัง พูดง่ายๆ ก็คือ การดำเนินการ [HttpPost] พร้อมด้วยพารามิเตอร์ประเภท SimpleModel จะเติมโมเดลนั้นด้วยค่าที่อยู่ในโพสต์ HTTP การกระทำนั้นสามารถใช้ค่านั้นในแบบจำลองนั้นเพื่อคงการเปลี่ยนแปลงหรือทริกเกอร์การกระทำบางอย่าง

ใช่แล้ว แพลตฟอร์มนั้นแตกต่างกันมากและคุณจำเป็นต้องตระหนักถึงความแตกต่างเหล่านี้อย่างถ่องแท้ แต่ก็มีการเปรียบเทียบที่สามารถทำได้ตามที่ฉันได้อธิบายไว้ข้างต้น

person Simon Fox    schedule 15.02.2017
comment
ขอบคุณ Simon ที่สละเวลาเปรียบเทียบ ช่วยให้เข้าใจ MVC จากมุมมองของ WPF/MVVM ได้อย่างแน่นอน - person LCaraway; 16.02.2017
comment
สิ่งนี้ไม่สมบูรณ์ เฟรมเวิร์ก MVVM ฝั่งไคลเอ็นต์เป็นเรื่องปกติสำหรับแอปพลิเคชันที่ใช้ ajax มากกว่า postbacks คุณแค่ครอบคลุมฝั่งเซิร์ฟเวอร์ (ซึ่งเป็นสิ่งสำคัญ แต่ก็ยัง...) - person ; 16.02.2017

ไม่ ไม่ ไม่ และ...ไม่

WPF ทำงานที่ฝั่งไคลเอ็นต์ และทุกอย่างกำลังเกิดขึ้นบนฝั่งไคลเอ็นต์ โดยจะเก็บสถานะและข้อมูลทั้งหมดไว้ในหน่วยความจำของเครื่องเดียวกัน

ในทางกลับกัน MVC ทำงานทั้งฝั่งไคลเอ็นต์และเซิร์ฟเวอร์โดยที่เซิร์ฟเวอร์ไม่ได้จัดเก็บสถานะ (คุณสามารถอ่านเพิ่มเติมเกี่ยวกับ HTTP stateless) และไคลเอนต์/เซิร์ฟเวอร์ไม่ได้ใช้หน่วยความจำหรือข้อมูลเดียวกัน

ดังนั้นเทคโนโลยีเหล่านั้นจึงแตกต่างอย่างสิ้นเชิงโดยมีเป้าหมายเพื่อกรณีการใช้งานที่แตกต่างกันโดยสิ้นเชิง

ในทางกลับกัน Classic ASP กำลังพยายามจำลองพฤติกรรมที่คุณอธิบายโดยใช้ post back โดยพื้นฐานแล้วจะเป็นการส่งการกระทำของผู้ใช้ทั้งหมดกลับไปยังเซิร์ฟเวอร์ และเซิร์ฟเวอร์สามารถดำเนินการได้สอดคล้องกัน (เช่น เปลี่ยนค่า ปุ่มปิดการใช้งาน ฯลฯ)

ฉันจะไม่แนะนำให้ใช้อีกต่อไปเพราะมันสร้างความกดดันที่ไม่จำเป็นให้กับเซิร์ฟเวอร์อย่างมาก

person Steve    schedule 15.02.2017
comment
โอเค ขอบคุณสตีฟ ฉันขอขอบคุณการป้อนข้อมูล ยังคงเรียนรู้สิ่งนี้มากมาย ไม่แน่ใจว่ามีวิธี mvc ในการเริ่มต้นโมเดลในคอนโทรลเลอร์ ตั้งค่า แล้วส่งค่าใดก็ตามไปยังมุมมองหรือไม่ จากนั้นย้อนกลับไปทางอื่นเมื่อมีการเปลี่ยนแปลงบางอย่างในมุมมอง ดูเหมือนว่าฉันจะทำ JavaScript มากมาย - person LCaraway; 16.02.2017
comment
หากเซิร์ฟเวอร์จำเป็นต้องรู้ว่าเมื่อใดการเลือกของผู้ใช้เปลี่ยนไปก่อนที่ผู้ใช้จะกดส่ง แสดงว่าคุณกำลังทำผิด อาจมีบางกรณีที่สิ่งนี้ถูกต้อง (เช่น คุณต้องการโหลดบางอย่างเมื่อมีการร้องขอเท่านั้น) ในกรณีนี้ คุณสามารถดูการเรียก API ได้ แต่อย่าลืมคำนึงถึงลักษณะการไร้สัญชาติของ HTTP - person Steve; 16.02.2017
comment
@steve หากคุณต้องการ SPA แบบเรียลไทม์ คุณสามารถใช้ mvvm, viewmodel ในเซิร์ฟเวอร์ และมุมมองด้วย html และ Javascript มีกรอบการทำงานสำหรับสิ่งนั้น - person Luis; 22.04.2018