การใช้ MVC กับ Windows Forms


102

ฉันจะหาตัวอย่างที่ดีในการใช้รูปแบบ MVC ใน Windows Forms ได้อย่างไร

ฉันพบแบบฝึกหัดและตัวอย่างโค้ดมากมายในไซต์ต่างๆ (เช่นThe Code Projectและ. NetHeaven) แต่หลาย ๆ แบบเป็นตัวแทนของรูปแบบผู้สังเกตการณ์มากกว่า MVC ตั้งแต่การสมัครที่ฉันต้องการที่จะพัฒนาเป็นโครงการโรงเรียนผมลังเลที่จะใช้กรอบเช่นPureMVCหรือMVC #



คำตอบ:


115

ฉันมีความเห็นว่าแอปพลิเคชันต่างกันมากและความเข้าใจของเราเกี่ยวกับวิธีการเขียนแอปพลิเคชันยังมีข้อ จำกัด อยู่มาก แอปพลิเคชัน Windows Forms ในอดีตที่ฉันเคยใช้งานนั้นแตกต่างกันมาก ความแตกต่างของการออกแบบบางส่วนที่ฉันเห็น ได้แก่ (รวมถึงชุดค่าผสมส่วนใหญ่):

  • พูดคุยโดยตรงกับฐานข้อมูล (ชั้น 2)
  • ใช้แบ็กเอนด์ที่เขียนขึ้นสำหรับแอปพลิเคชันที่กำหนด (ระดับ 3)
  • ใช้ชุดบริการบนเว็บที่เขียนขึ้นเพื่อใช้งานโดยแอปพลิเคชันจำนวนมากและไม่สามารถเปลี่ยนแปลงสำหรับแอปพลิเคชันของคุณได้ (สถาปัตยกรรมเชิงบริการ)
  • การอัปเดตที่ดำเนินการโดยการดำเนินการCRUD
  • กำลังอัปเดตด้วยรูปแบบคำสั่ง (ส่งคำสั่งไปยังเซิร์ฟเวอร์แบ็กเอนด์)
  • การใช้งานการผูกข้อมูลจำนวนมาก/ ไม่มีการผูกข้อมูล
  • ข้อมูลส่วนใหญ่เป็น "ตารางเหมือน" (เช่นใบแจ้งหนี้) ที่ทำงานได้ดีในการควบคุมกริดมาตรฐาน / ต้องการการควบคุมแบบกำหนดเองสำหรับข้อมูล UI ส่วนใหญ่
  • ผู้พัฒนาหนึ่งคน / ทีมจากนักพัฒนา 10 หรือ 20 คน (เฉพาะบน UI)
  • การทดสอบหน่วยจำนวนมากโดยใช้ mocks ฯลฯ / ไม่มีการทดสอบหน่วย

ดังนั้นฉันไม่คิดว่าจะเป็นไปได้ที่จะสร้างการนำ MVC (หรือ MVP) มาใช้งานที่เข้ากันได้ดีเสมอไป

โพสต์ที่ดีที่สุดที่ฉันได้เห็นจริงๆอธิบาย MVC และทำไมระบบ MVC ถูกสร้างขึ้นวิธีที่มันเป็นเป็นชุด "สร้าง CAB ตัวคุณเอง" โดยเจเรมี D มิลเลอร์ หลังจากทำงานเสร็จแล้วคุณควรจะเข้าใจตัวเลือกของคุณได้ดีขึ้นมาก คำแนะนำสำหรับไคลเอ็นต์อัจฉริยะของ Microsoft (CAB / Microsoft Composite Application Block)ควรได้รับการพิจารณาด้วย ค่อนข้างซับซ้อน แต่ก็ใช้ได้ดีกับแอปพลิเคชันที่มีขนาดพอดี

การเลือกใช้MVC / MVP สำหรับโครงการ Winformsให้ภาพรวมที่น่าอ่าน ผู้คนจำนวนมากเช่นPureMVC ฉันไม่เคยใช้มัน แต่ฉันจะดูในครั้งต่อไปที่ฉันต้องการเฟรมเวิร์ก MVC

" พรีเซนเตอร์ครั้งแรก " เป็นแนวทางการพัฒนาซอฟแวร์ที่รวมความคิดของดูรุ่นพรีเซนเตอร์ (MVP) รูปแบบการออกแบบและทดสอบขับเคลื่อนการพัฒนา ช่วยให้คุณเริ่มต้นด้วยการเขียนแบบทดสอบในภาษาของลูกค้า ตัวอย่างเช่น:

"เมื่อฉันคลิกปุ่ม" บันทึก "ไฟล์ควรได้รับการบันทึกและคำเตือนไฟล์ที่ไม่ได้บันทึกจะหายไป"

ฉันไม่มีประสบการณ์ในการใช้ "Presenter First" แต่ฉันจะลองใช้เมื่อมีโอกาสเพราะมันดูมีแนวโน้มมาก

คำถามกองมากเกินอื่น ๆ ที่คุณอาจอาจต้องการที่จะมองไปที่มีที่นี่และที่นี่

หากคุณกำลังคิดของการใช้WPFที่จุดใด ๆ จะดูที่การ(MVVM) รุ่น-View ViewModelรูปแบบ นี่เป็นวิดีโอที่ดีมากที่คุณควรจะดูที่: เจสัน Dolinger บน Model-View-ViewModel

รูปแบบการออกแบบ MVVM (Model View View Model) สำหรับ Winformsให้ตัวเลือกอื่นที่อาจทำให้การแปลงเป็น WPF ง่ายขึ้นหากจำเป็น Magical.Trevorเป็นอีกตัวอย่าง MVVM สำหรับ Windows Forms ซึ่งรวมถึงการผูกอัตโนมัติตามชื่อคุณสมบัติ


ถามตัวเองด้วยว่าทำไมคุณถึงใช้ MVC

  • คุณต้องการที่จะทดสอบหน่วยรหัสให้ได้มากที่สุดหรือไม่?
  • คุณพยายามอนุญาตให้นำโค้ดกลับมาใช้ได้มากที่สุดหรือไม่?
  • คุณกำลังพยายามทำให้ฐานรหัสของคุณเข้าใจง่ายหรือไม่?
  • เหตุผลอื่น ๆ 101 ประการที่สามารถใช้ได้กับโครงการที่กำหนด

เมื่อคุณชัดเจนในจุดมุ่งหมายของคุณแล้วการเลือกใช้งานอย่างใดอย่างหนึ่งจะง่ายขึ้น


@AgnelKurian CAB เป็นชุดโค้ดตัวอย่างจาก Microsoft เกี่ยวกับวิธีการสร้างแอปซึ่งตอนนี้ส่วนใหญ่เป็นประวัติศาสตร์
Ian Ringrose

ฮาฮา! ใช่ฉันจำ "บล็อกแอปพลิเคชัน" เหล่านั้นได้แล้ว
Agnel Kurian

45

อัปเดต: นอกเหนือจากคำตอบก่อนหน้าของฉันด้านล่างฉันขอแนะนำให้อ่านเกี่ยวกับแนวทาง"ผู้นำเสนอคนแรก" (โดยเฉพาะบทความ PDF)

ฉันอยากจะแนะนำ MVP (รูปแบบ PassiveView จริง) แทน MVC คุณไม่จำเป็นต้องมีเฟรมเวิร์กพิเศษสำหรับสิ่งนี้มันเป็นเพียงวิธีการจัดระเบียบโค้ดของคุณ

แนวทางหนึ่ง (ซึ่งฉันมักจะใช้) คือการแบ่งหน้าต่างแต่ละบานออกเป็นสามเอนทิตี:

  1. คลาสผู้นำเสนอ / คอนโทรลเลอร์ - นี่คือสิ่งที่คุณเริ่มต้นเมื่อพัฒนาแบบฟอร์ม นี่คือจุดที่ตรรกะ "ธุรกิจ" ของคุณส่วนใหญ่ / ทั้งหมดควรอยู่
  2. อินเทอร์เฟซมุมมอง (IView) ซึ่งมีเมธอดคุณสมบัติและเหตุการณ์ต่างๆ อินเทอร์เฟซนี้เป็นสิ่งที่ผู้นำเสนอรู้เกี่ยวกับแบบฟอร์มของคุณ
  3. ในตอนท้ายเมื่อคุณใช้ผู้นำเสนอและมุมมองเสร็จสิ้น (รวมถึงการทดสอบหน่วย) จากนั้นคุณสามารถสร้างคลาสฟอร์มจริงและทำให้อินเทอร์เฟซ IView ใช้งานได้ จากนั้นเป็นเพียงคำถามในการเพิ่มการควบคุมที่เหมาะสมลงในแบบฟอร์มและต่อสายเข้ากับอินเทอร์เฟซ

ตัวอย่างรหัส (รหัสเทียมแบบธรรมดาสำหรับภาพประกอบ):

interface IView
{
    string Username { get; set; }
    string Password { get; set; }

    event EventHandler LogOnButtonClicked;

    void InformUserLogOnFailed();
    void MoveToMainScreen();
}

class Presenter
{
    public Presenter(IView view)
    {
        this.view = view;
        view.LogOnButtonClicked += new EventHandler(OnLogOnButton);
    }

    private void OnLogOnButton()
    {
        // we ask some service to verify the username/password
        bool isLogOnOk = logOnService.IsUserAndPasswordOk(view.Username, view.Password);
        if (isLogOnOk)
            view.MoveToMainScreen();
        else
        {
            view.Username = "";
            view.Password = "";
            view.InformUserLogOnFailed();
        }
    }

    private IView view;
}

class Form : IView
{
    public Form()
    {
        presenter = new Presenter(this);
    }

    public string Username
    {
        get { return TextBoxUsername.Text; }
        set { TextBoxUsername.Text = value; }
    }

    public string Password
    {
        get { return TextBoxPassword.Text; }
        set { TextBoxPassword.Text = value; }
    }

    public void InformUserLogOnFailed()
    {
        MessageBox.Show("Invalid username or password.");
    }

    public void MoveToMainScreen()
    {
        // code for opening another form...
    }

    private Presenter presenter;
}

7
นี่คือการนำตัวแปร MVP ที่เรียกว่า PassiveView มาใช้ ในมุมมองแบบพาสซีฟมุมมองไม่ควรเลือกผู้นำเสนอของเขา สำหรับตัวอย่างที่คล้ายกัน (แต่มีมุมมองแฝงจริงๆ) ตรวจสอบตัวอย่างdanieleteti.it/?p=221 (ตัวอย่างในภาษาเดลฟี)
Daniele Teti

6

คุณได้ดูPureMVC แล้วหรือยัง? ฉันพบว่าไม่มีใครเห็นด้วยกับสิ่งที่ MVC ดูเหมือนจริงๆเมื่อพวกเขาเริ่มสร้างการนำไปใช้งานเฉพาะ

ปรับปรุง: คุณสามารถสร้างเริ่มต้นของคุณเองกับสิ่งที่ง่ายเช่นMobileMVC รหัส Compact Framework ควรคอมไพล์ / รัน OK บน Windows เนื่องจากนี่เป็นงานมอบหมายของโรงเรียนฉันจึงขอแนะนำให้คุณใช้เวลาเรียนรู้ว่า MVC ทำงานอย่างไร


ฉันมีงานมอบหมายของโรงเรียนสำหรับแอปพลิเคชันง่ายๆในการจัดการร้านหนังสือและฉันค่อนข้างลังเลที่จะใช้กรอบงานเช่น PureMVC ฉันกำลังมองหาสิ่งที่ง่ายกว่านี้
kjv

3

คุณอาจต้องการที่จะดูที่ความแตกต่างของการดำเนินการ

นี่คือในSourceForge

IMO เป็นการปรับปรุง MVC อย่างมากแม้ว่าจะยังค่อนข้างผิดปกติ


2

เป็นตัวอย่างที่ดีในการดำเนินการกลิ้งของคุณเอง MVC โดยใช้แบบฟอร์ม Windows สามารถพบได้ที่นี่ รวมซอร์สโค้ด

เมื่อคุณอ่านศึกษาและเขียนโค้ดสำหรับงานนี้คุณจะพบว่ามีความไม่เห็นด้วยมากมายเกี่ยวกับวิธีการนำ MVC ไปใช้ กรณีนี้เป็นกรณีง่ายๆที่สะท้อนให้เห็นถึงการแยกความกังวลรวมทั้งตัวอย่างที่ดีของ 'ท่อประปา' ที่จำเป็นในการเชื่อมต่อสิ่งนี้

เมื่อคุณออกจากโรงเรียนคุณอาจจะอยากถอยกลับไปใช้กรอบอย่างที่ผู้โพสต์อื่นแนะนำ


2

บล็อกแอปพลิเคชัน Microsoft Composite Interface เริ่มต้นชีวิตด้วยการใช้ MVC (ท่ามกลางรูปแบบอื่น ๆ ที่ใช้งาน) อย่างไรก็ตามเวอร์ชันที่วางจำหน่ายได้พัฒนาไปสู่การใช้ MVP ซึ่งอาจเป็นที่ถกเถียงกันอยู่ว่าเป็นการตีความแนวคิด MVC ที่แตกต่างออกไป

หากคุณยินดีที่จะตรวจสอบโค้ดของการใช้ MVP ที่สมบูรณ์ (และซับซ้อนมาก) คุณสามารถค้นหา MS-CAB เป็นหนึ่งในส่วนประกอบของ Microsoft Smart Client Software Factory มันมาพร้อมกับซอร์สโค้ด คุณสามารถค้นหาได้ที่นี่ โชคดี!

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.