เมื่อสัปดาห์ที่แล้วฉันกำลังอ่านบทความเกี่ยวกับการใช้ WCF กรอบเอนทิตีและวิธีการขนส่งหน่วยงานข้ามขอบเขตการให้บริการ หนึ่งในบทความที่ฉันพบรวมถึงโครงการสาธิตที่ใช้ประโยชน์จากรูปแบบ Presenter Model View (MVP)
หลังจากสำรวจโครงการสาธิตฉันคิดว่ามันน่าสนใจที่จะเขียนบทความเกี่ยวกับรูปแบบนี้ เครื่องมือค้นหาที่คุณชื่นชอบจะให้ลิงก์มากมายแก่คุณอย่างมีความสุขกับบทความอื่น ๆ ที่อธิบายรูปแบบนี้อย่างละเอียด
สำหรับบทความนี้ฉันตัดสินใจที่จะจัดหาการใช้งานที่เป็นรูปธรรมและมุ่งเน้นไปที่ทฤษฎีที่อยู่เบื้องหลังรูปแบบ
มาม้วน ...
แน่นอนว่าจำเป็นต้องมีทฤษฎีเล็กน้อยดังนั้นเรามาให้พ้นทางกัน
ในขณะที่คุณสามารถหักจากชื่อรูปแบบ MVP ประกอบด้วยสามส่วนที่แตกต่างกัน: โมเดลมุมมองและผู้นำเสนอ แต่ละส่วนเหล่านี้มีบทบาทของตัวเองในการสร้างการแยกข้อกังวลระหว่างการนำเสนอธุรกิจและเลเยอร์การเข้าถึงข้อมูล
โมเดลมีหน้าที่ในการจัดการการเข้าถึงข้อมูลผู้นำเสนอสื่อสารกับโมเดลและส่งผ่านข้อมูลจากและไปยัง มุมมองได้รับข้อมูลจากผู้นำเสนอและส่งผ่านข้อมูลกลับมันไม่เคยสื่อสารโดยตรงกับโมเดล ผู้นำเสนอเป็นสิ่งที่น่าสนใจสำหรับมุมมองและโมเดล
รูปที่ 1 - การโต้ตอบรูปแบบ MVP

ภาพด้านบนแสดงให้เห็นถึงมุมมองว่าเป็นการใช้อินเทอร์เฟซ เลเยอร์การนำเสนอไม่ว่าจะเป็นแอปพลิเคชัน ASP.NET, WinForms หรือ WPF จำเป็นต้องใช้อินเทอร์เฟซมุมมองหนึ่งหรือมากกว่า ผู้นำเสนอในการสื่อสารกับการใช้งานมุมมองผ่านอินเทอร์เฟซนี้มันไม่รู้อะไรเลยเกี่ยวกับการใช้งานจริง
สิ่งนี้ให้การมีเพศสัมพันธ์แบบหลวมและป้องกันไม่ให้รหัสของคุณขึ้นอยู่กับเทคโนโลยีที่ใช้สำหรับเลเยอร์การนำเสนอ แนวคิดคือคุณควรจะสามารถแทนที่เลเยอร์นี้ได้โดยไม่ส่งผลกระทบต่อตรรกะการเข้าถึงธุรกิจและข้อมูลของคุณ
ทั้งหมดนี้อาจดูคลุมเครือเล็กน้อย แต่สิ่งต่าง ๆ ควรเคลียร์เมื่อเราไปยังประเด็นต่อไปนี้ซึ่งให้การใช้งานจริงของรูปแบบนี้ สำหรับตัวอย่างจะใช้แอปพลิเคชัน ASP.NET
จุดเริ่มต้นที่สมเหตุสมผลที่สุดคือโมเดล เนื่องจากมีหน้าที่รับผิดชอบในการจัดการการเข้าถึงข้อมูลและการจัดเก็บเราจึงต้องสร้างที่เก็บข้อมูลทางกายภาพก่อน สำหรับสิ่งนี้ฉันใช้ SQL Server 2005 Express สร้างฐานข้อมูลใหม่ที่เรียกว่า Southwind และเพิ่มหนึ่งตารางชื่อลูกค้า ตารางมี 3 ฟิลด์คือ:
นั่นคือฐานข้อมูล มายิง Visual Studio 2008 และสร้างโซลูชันว่างเปล่าใหม่ชื่อ Avppattern ถัดไปเพิ่มไลบรารีคลาสชื่อ "ฐานข้อมูล"
โดยปกติฉันจะให้ชื่อโครงการที่เป็นไปตามรูปแบบ "บริษัท . product.library" แต่เพื่อประโยชน์ของความเรียบง่ายให้ทำให้มันสั้นและเรียบง่าย นอกจากนี้ยังลบไฟล์ class1.cs autogenerated หลังจากเพิ่มโครงการลงในโซลูชัน
มาสร้างโมเดลจากฐานข้อมูลโดยใช้ Entity Framework (EF) ดังนั้นให้แน่ใจว่าคุณใช้ Visual Studio 2008 และติดตั้ง Service Pack 1 สำหรับ Visual Studio และ. NET Framework 3.5 คุณสามารถดาวน์โหลดชุดบริการได้ที่นี่
เพิ่มโมเดลข้อมูลเอนทิตีเฟรมเวิร์กลงในไลบรารีคลาสโดยเลือกเพิ่มรายการใหม่โมเดลข้อมูลเอนทิตี ADO.NET จากเมนูบริบทของโครงการในโซลูชัน Explorer Visual Studio จะแสดงตัวช่วยสร้างโมเดลข้อมูลเอนทิตี ตั้งชื่อโมเดล Southwind และให้ Visual Studio สร้างโมเดลให้คุณ เมื่อถามว่าวัตถุฐานข้อมูลใดที่คุณต้องการรวมไว้ในโมเดลของคุณเพียงเลือกตารางลูกค้าจากโหนดตาราง
หมายเหตุ : หากคุณไม่คุ้นเคยกับการสร้างแบบจำลองข้อมูลด้วยเฟรมเวิร์กเอนทิตีฉันขอแนะนำวิดีโอการฝึกอบรมนี้จาก Alex James มันแสดงวิธีการสร้างโมเดลข้อมูลเอนทิตีง่าย ๆ ตั้งแต่เริ่มต้น
รูปที่ 2 แสดงโมเดลข้อมูลเอนทิตีผลลัพธ์ โมเดลไม่สามารถทำได้ง่ายกว่านี้มาก สิ่งนี้ทำโดยมีวัตถุประสงค์เพื่อให้สิ่งต่าง ๆ ง่ายที่สุดเท่าที่จะเป็นไปได้และเพื่อให้ความสำคัญกับรูปแบบ MVP
รูปที่ 2 - โมเดลข้อมูลเอนทิตี

ตรวจสอบให้แน่ใจว่าได้เปลี่ยนชื่อ EntityTypes และ EntitySets ของคุณเป็นชื่อที่เหมาะสมหลังจากสร้างแบบจำลองข้อมูลแล้ว กฎของหัวแม่มือคือการใช้คำนามเดียวสำหรับ entityType และพหูพจน์สำหรับเอนทิตีเซ็ต ดังนั้นในกรณีนี้ EntityType ของเราควรตั้งชื่อลูกค้าและลูกค้า EntitySet ชื่อสำหรับ EntityType นั้นโอเคแล้วเนื่องจากได้รับมรดกจากตารางลูกค้าดังนั้นเพียงเลือกลูกค้า EntityType และปรับคุณสมบัติชื่อชุดเอนทิตี
รูปที่ 3 - ชื่อชุดเอนทิตี

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

ตอนนี้โมเดลอยู่ในสถานที่ให้เพิ่มเลเยอร์ธุรกิจที่ด้านบนของที่เราสามารถกำหนดตรรกะทางธุรกิจที่กำหนดเองของเรา เพื่อประโยชน์ของความเรียบง่ายฉันจะรักษาจำนวนรหัสที่ จำกัด ในเลเยอร์นี้
โปรดทราบว่าเลเยอร์เหล่านี้บังคับใช้การแยกเชิงตรรกะ (N-layer) เท่านั้นไม่ใช่ทางกายภาพ (N-tier) เลเยอร์ทั้งหมดอาศัยอยู่ในเครื่องเดียวกันแม้ว่าคุณจะสามารถเลือกที่จะปลดปล่อยพวกเขาในหลายเครื่อง / ชั้นและสร้างแอปพลิเคชันแบบกระจายหรือ N-Tier อย่างแท้จริง
ในการตั้งค่าเลเยอร์ธุรกิจให้เพิ่มไลบรารีคลาสใหม่ลงในโซลูชันและเรียกว่าธุรกิจ ถัดไปเปลี่ยนชื่อไฟล์ class.cs เริ่มต้นเป็น customerManager.cs นอกจากนี้ยังเพิ่มการอ้างอิงไปยังฐานข้อมูลไลบรารีคลาสที่สร้างขึ้นก่อนหน้านี้และไปยังชุดประกอบ System.Data.Entity
การแสดงรายการ 1 แสดงคลาส CustomerManager ซึ่งมีตรรกะทางธุรกิจบางอย่างสำหรับการทำงานกับเอนทิตีลูกค้าจาก Entity Data Model (EDM) รหัสนี้ค่อนข้างอธิบายตนเอง
รายการ 1 - คลาสลูกค้า
using System . Collections . Generic ;
using System . Linq ;
using Database ;
namespace Business
{
public class CustomerManager
{
private readonly SouthwindEntities context ;
#region Constructor(s)
public CustomerManager ( )
{
context = new SouthwindEntities ( ) ;
}
#endregion
#region Methods
// Retrieve a generic list of Customer entities.
// This method will return all the customers found in the Customer table.
public List < Customer > GetCustomers ( )
{
var q = from c in context . Customers
select c ;
return q . ToList ( ) ;
}
#endregion
}
}รูปที่ 5 - โซลูชันที่อัปเดต

หมายเหตุ : การตั้งค่าแอปพลิเคชัน N-Tier จะรวมถึงการแนะนำเลเยอร์บริการซึ่งเลเยอร์การนำเสนอเข้ามา จากนั้นเลเยอร์บริการจะใช้วัตถุธุรกิจที่พบในเลเยอร์ธุรกิจ ไม่มีความสัมพันธ์โดยตรงระหว่างการนำเสนอและเลเยอร์ธุรกิจอีกต่อไปเลเยอร์บริการทำหน้าที่เป็นระดับกลาง ในบทความในอนาคตฉันจะกล่าวถึงสิ่งนี้โดยแสดงวิธีการขนส่งเอนทิตีของ EF ข้ามขอบเขตการบริการ
เลเยอร์ธุรกิจมีเพียงวิธีเดียวที่มีประโยชน์คือ "รายการ getCustomers ()" ผู้นำเสนอในรูปแบบ MVP จะเรียกวิธีการนี้บนวัตถุธุรกิจลูกค้าเพื่อส่งข้อมูลไปยังมุมมอง
แอปพลิเคชันตัวอย่างแสดงรายการลูกค้าโดยใช้รูปแบบ MVP เท่านั้น นี่อาจเป็นไปได้มากเกินไป แต่ก็ยังคงง่ายพอ ๆ กับการออกแบบ เป้าหมายหลักของ "สวัสดีโลก!" ประเภทของแอปพลิเคชันคือการรับแนวคิดเกี่ยวกับวิธีการใช้รูปแบบนี้ ฟังก์ชั่นจริงที่นำเสนอโดยแอปพลิเคชันนั้นไม่สำคัญ
การใช้มุมมองจริง (หน้า ASPX, WinForms, WPF ... ฯลฯ ) จะต้องใช้อินเทอร์เฟซมุมมอง การใช้มุมมองจำเป็นต้องสร้างอินสแตนซ์ของผู้นำเสนอและส่งผ่านตัวเองเป็นพารามิเตอร์ในตัวสร้าง ตัวสร้างของผู้นำเสนอมีหนึ่งพารามิเตอร์ซึ่งเป็นประเภทของอินเทอร์เฟซมุมมอง
รายการ 2 แสดงรายการอินเทอร์เฟซ IVIEW ซึ่งเราจะนำไปใช้ในไม่ช้าในหน้า ASP.NET ASPX มีเหตุการณ์หนึ่งที่ชื่อ PrepareView เหตุการณ์ PrepareView ใช้ตัวแทนที่มีลายเซ็นระบุว่าจะไม่ส่งคืนสิ่งใดและไม่ต้องใช้พารามิเตอร์
มุมมองควรเพิ่ม "เหตุการณ์ว่าง" ประเภทนี้เพื่อแสดงถึงผู้นำเสนอว่าควรดำเนินการบางอย่าง การกระทำในกรณีนี้บ่งบอกว่าผู้นำเสนอควรรีเฟรชรายการลูกค้าที่การใช้งานมุมมองจะรักษาไว้ ผู้นำเสนอสามารถเข้าถึงรายชื่อลูกค้านี้ผ่านคุณสมบัติลูกค้าของ ILIST ซึ่งประกาศเป็นส่วนหนึ่งของอินเทอร์เฟซ
รายการ 2 - ดูอินเทอร์เฟซ
public delegate void VoidEventHandler ( ) ;
public interface IView
{
event VoidEventHandler PrepareView ;
IList < Customer > Customers { set ; }
}ในการเพิ่มอินเทอร์เฟซมุมมองในโครงการของคุณก่อนเพิ่มโครงการไลบรารีคลาสใหม่ลงในโซลูชันที่เรียกว่าการนำเสนอ ถัดไปเพิ่มอินเทอร์เฟซใหม่และคัดลอกและวางรหัสที่แสดงในรายการด้านบน ไลบรารีรหัสการนำเสนอจะมีผู้นำเสนอและอินเทอร์เฟซที่ใช้งาน
ฉันแยกอินเทอร์เฟซมุมมองและผู้นำเสนอในไลบรารีรหัสแยกต่างหากเพื่อให้คุณสามารถแชร์ได้อย่างง่ายดายระหว่าง "เฟรมเวิร์กมุมมอง" หลายอย่างเช่น ASP.NET, Winforms, WPF ... ฯลฯ รูปที่ 6 แสดงวิธีที่ฉันเลือกที่จะจัดระเบียบไลบรารีรหัสนี้
รูปที่ 6 - โซลูชันที่อัปเดต

อย่าลืมเพิ่มการอ้างอิงไปยังฐานข้อมูลและโครงการธุรกิจและชุดประกอบ System.Data.Entity
สำหรับส่วนสุดท้ายของรูปแบบ MVP เราจำเป็นต้องจัดหาผู้นำเสนอ คลาสลูกค้าประจำตัวที่แสดงในรายการ 3 ใช้การอ้างอิงถึงการใช้งาน IVIEW ในตัวสร้าง วิธีนี้สามารถสื่อสารกับมุมมองโดยไม่ทราบอะไรเกี่ยวกับการใช้งานจริง มันเป็นข้อต่อแบบหลวม ๆ ที่ทำให้รูปแบบ MVP เหมาะสำหรับ "เฟรมเวิร์กมุมมอง" ที่แตกต่างกัน
นอกจากนี้ในคอนสตรัคเตอร์เหตุการณ์ทั้งหมดของอินเทอร์เฟซมุมมองจะถูกเชื่อมต่อกับตัวจัดการเหตุการณ์ ในกรณีนี้มีเพียงเหตุการณ์เดียว เหตุการณ์ PrepareView จะถูกเชื่อมต่อกับตัวจัดการเหตุการณ์ View_prepeReview สิ่งนี้จะเรียกวิธีการส่วนตัวของผู้นำเสนอ getCustomers () ซึ่งส่งคืนคอลเลกชันลูกค้า "รีเฟรช" และกำหนดให้กับคอลเลกชันลูกค้าที่ดูแลโดยการใช้งานมุมมอง
รายการ 3 - คลาสลูกค้านำเสนอ
public class CustomersPresenter : ICustomersPresenter
{
#region Fields
private readonly IView view ;
#endregion
#region Constructor(s)
public CustomersPresenter ( IView view )
{
// Save a reference to the view
this . view = view ;
// Hook up an event handler for the events of the view
view . PrepareView += view_PrepareView ;
}
#endregion
#region Private methods
private List < Customer > GetCustomers ( )
{
return new CustomerManager ( ) . GetCustomers ( ) ;
}
#endregion
#region ICustomersPresenter Members
public virtual void view_PrepareView ( )
{
view . Customers = GetCustomers ( ) ;
}
#endregion
}ผู้นำเสนอข้างต้นยังใช้อินเทอร์เฟซ ในซอร์สโค้ดตัวอย่างอินเทอร์เฟซนี้จะว่างเปล่า ฉันวางไว้ที่นั่นเพื่อวัตถุประสงค์ในการเป็นตัวอย่างเท่านั้น คุณสามารถออกอินเทอร์เฟซนี้ได้หากคุณต้องการ คุณอาจต้องการมันสำหรับกรอบการทดสอบหน่วยที่คุณชื่นชอบเพื่อเยาะเย้ยผู้นำเสนอเช่น
ดังนั้นหน้ามุมมองหรือ ASPX ในกรณีของเราจำเป็นต้องใช้อินเทอร์เฟซมุมมองและทริกเกอร์เหตุการณ์ PREPAREView เพื่อรับรายชื่อลูกค้าที่อัปเดตจากผู้นำเสนอ มุมมองนั้นไม่ได้สื่อสารกับฐานข้อมูลหรือเลเยอร์ธุรกิจโดยตรง ผู้นำเสนอจัดการการสื่อสารกับเลเยอร์ธุรกิจที่ดึงข้อมูลโดยการระบุรูปแบบ (หรือเลเยอร์การเข้าถึงข้อมูลหากคุณต้องการ)
เพื่อให้เสร็จสิ้นบทความนี้มาดูกันว่าทั้งหมดนี้มารวมกันในโครงการสาธิต ASP.NET ได้อย่างไร เพิ่มโครงการใหม่โดยใช้เทมเพลตโครงการ ASP.NET Web Application Project ลงในโซลูชัน เพิ่มการอ้างอิงไปยังโครงการการนำเสนอและฐานข้อมูลและชุดประกอบ System.Data.Entity
เพิ่ม gridview ชื่อ "gridview1" และปุ่มชื่อ "btnrefresh" ไปยังหน้า default.aspx เพิ่มรหัสในรายการ 4 ไปยังรหัสด้านหลังของหน้า
รายการ 4 - default.aspx รหัสเบื้องหลัง
public partial class _Default : System . Web . UI . Page , IView
{
private CustomersPresenter presenter ;
protected override void OnInit ( EventArgs e )
{
presenter = new CustomersPresenter ( this ) ;
}
protected void Page_Load ( object sender , EventArgs e )
{
if ( ! IsPostBack )
{
PrepareView ( ) ;
}
}
protected void btnRefresh_Click ( object sender , EventArgs e )
{
PrepareView ( ) ;
}
#region IView Members
public event VoidEventHandler PrepareView ;
public IList < Database . Customer > Customers
{
set
{
GridView1 . DataSource = value ;
GridView1 . DataBind ( ) ;
}
}
#endregion
}รหัสทั้งหมดที่อยู่เบื้องหลังของหน้า ASPX ทำคือใช้อินเตอร์เฟส IVIEW สร้างผู้นำเสนอและผ่านการใช้งาน IVIEW เป็นตัวของตัวเองในตัวสร้าง จากนั้นสิ่งที่เหลืออยู่คือการเรียกเหตุการณ์ PrepereView () ของอินเตอร์เฟส IVIEW ในเวลาที่เหมาะสม
ในระหว่างการสร้างผู้นำเสนอตัวจัดการเหตุการณ์จะได้รับมอบหมายให้กับกิจกรรมนี้โดยอัตโนมัติซึ่งทำให้แน่ใจว่าเมื่อมีการกระตุ้นผู้นำเสนอจะรู้วิธีอัปเดตคอลเลกชันของลูกค้าที่ดูแลโดยหน้า หน้าเว็บเองไม่รู้ว่าข้อมูลนี้มาจากไหนหรือได้รับการดึงข้อมูลอย่างไร Dumber A View ดีกว่า
เมื่อดูหน้านี้ในเบราว์เซอร์นี่คือผลลัพธ์:
รูปที่ 7 - การสาธิตเว็บไซต์ ASP.NET

หมายเหตุ : อย่าลืมเพิ่มการเชื่อมต่อที่ต้องการโดยเฟรมเวิร์กเอนทิตีในไฟล์การกำหนดค่า web.config คุณสามารถค้นหาการเชื่อมต่อ string ในไฟล์ app.config ของโครงการไลบรารีคลาสฐานข้อมูล มันถูกแทรกโดยอัตโนมัติเมื่อ Visual Studio สร้างโมเดลข้อมูลเอนทิตี
แน่นอนว่าสตริงการเชื่อมต่อในซอร์สโค้ดตัวอย่างจะไม่ทำงานบนคอมพิวเตอร์ของคุณเนื่องจากถูกสร้างขึ้นกับฐานข้อมูลท้องถิ่นของฉัน ดังนั้นอย่าลืมปรับให้เหมาะสม
รูปที่ 8 - โซลูชันที่อัปเดต

เป็นขั้นตอนสุดท้ายของบทความนี้ให้สร้างมุมมองโดยใช้แอปพลิเคชัน Windows Forms เพียงเพื่อแสดงให้คุณเห็นว่ารูปแบบ MVP มีความยืดหยุ่นอย่างไร ขั้นตอนในการทำเช่นนี้เกือบจะเหมือนกับตัวอย่างก่อนหน้าของการสร้างเว็บไซต์ ASP.NET เพิ่มแอปพลิเคชัน Windows Forms ใหม่ลงในโซลูชันของคุณและเพิ่มการอ้างอิงไปยังฐานข้อมูลและโครงการการนำเสนอและชุดประกอบ System.Data.Entity
ถัดไปเพิ่มการควบคุม DataGridView และปุ่มลงในแบบฟอร์ม รหัสสำหรับแบบฟอร์มจะแสดงในรายการด้านล่าง มันเกือบจะเหมือนกับของหน้า default.aspx อย่าลืมเพิ่มสตริงการเชื่อมต่อ Entity Framework ลงในไฟล์การกำหนดค่า App.Config
รายการ 5 - รหัส Form1.cs
using System ;
using System . Windows . Forms ;
using Presentation . Presenters ;
using Presentation . ViewInterfaces ;
namespace WindowsFormsApplication
{
public partial class Form1 : Form , IView
{
private CustomersPresenter presenter ;
public Form1 ( )
{
InitializeComponent ( ) ;
presenter = new CustomersPresenter ( this ) ;
}
private void Form1_Load ( object sender , EventArgs e )
{
PrepareView ( ) ;
}
private void btnRefresh_Click ( object sender , EventArgs e )
{
PrepareView ( ) ;
}
#region IView Members
public event VoidEventHandler PrepareView ;
public System . Collections . Generic . IList < Database . Customer > Customers
{
set
{
dataGridView1 . DataSource = value ;
}
}
#endregion
}
}Voila ในที่สุดเราก็ทำเสร็จแล้ว โปรดทราบว่าแม้ว่าตัวอย่าง ASP.NET และ WinForms นั้นเกือบจะเหมือนกันในรหัส แต่อาจไม่ใช่กรณีในแอปพลิเคชันที่ซับซ้อนมากขึ้น ประเภทของการโต้ตอบในอินเทอร์เฟซผู้ใช้ทั้งสองประเภทนี้แตกต่างกันอย่างมากและเกิดขึ้นกับผู้นำเสนอที่คุณสามารถใช้ในทุกสถานการณ์อาจไม่ชัดเจน
รูปที่ 9 - การสาธิตแอปพลิเคชัน Windows Forms

รูปที่ 10 - โซลูชันที่อัปเดต

สำหรับบทความนี้การตีความแบบคลาสสิกของรูปแบบ MVP ถูกนำมาใช้และแสดงโดยใช้โซลูชัน ASP.NET รูปแบบ MVP ดั้งเดิมถือว่าเป็น "เกษียณ" นับตั้งแต่มาร์ตินฟาวเลอร์ประกาศเช่นนั้น รูปแบบสามารถแบ่งออกเป็นสองค่ายในขณะนี้อยู่:
อ่านบทความ Microsoft Patterns & Practices สำหรับข้อมูลเพิ่มเติม
ฉันเขียนบทความนี้เพื่อจัดหารูปแบบ MVP ที่เป็นรูปธรรมขณะที่ฉันกำลังสำรวจในเวลานั้น อย่างไรก็ตามมันอาจจะเป็นการดีที่จะยังคงชัดเจนและรอจนกว่า Microsoft จะปล่อยกรอบ ASP.NET MVC สำหรับผู้ที่ต้องการเลียนแบบกรอบมุมมองแบบจำลอง (MVC) ตอนนี้ฉันขอแนะนำให้อ่านบทความนี้โดยรูปแบบและแนวทางปฏิบัติของ Microsoft
หมายเหตุ : รูปแบบ MVP เป็นอนุพันธ์ของรูปแบบคอนโทรลเลอร์มุมมองแบบจำลอง (MVC) ในช่วงเวลาของการเขียนนี้ Microsoft กำลังยุ่งอยู่กับการพัฒนาเฟรมเวิร์ก ASP.NET MVC เมื่อทำแผนที่สถาปัตยกรรมสำหรับโครงการเว็บไซต์ใหม่ฉันขอแนะนำให้ตรวจสอบกรอบนี้
ความแตกต่างที่สำคัญระหว่างรูปแบบ MVP และ MVC สามารถระบุได้ว่าใครเป็นผู้รับผิดชอบในการจัดการอินพุตของผู้ใช้เช่นคีย์บอร์ดและเหตุการณ์ Moue ในรูปแบบ MVP ตัว GUI นั้นมีความรับผิดชอบและจำเป็นต้องมอบหมายให้พวกเขาไปยังผู้นำเสนอผ่านเหตุการณ์ ในรูปแบบ MVC คอนโทรลเลอร์มีหน้าที่จัดการกับเหตุการณ์เหล่านี้