2012-04-30 24 views
7

Tôi đã triển khai mẫu MVP trong một vài ứng dụng WinForms sử dụng chế độ xem thụ động. Tôi thực hiện một giao diện có chứa các thuộc tính và các đại biểu dưới dạng Action < T> và Func < T> để kết nối các sự kiện UI trong khung nhìn cụ thể và gọi lại cho người trình bày.MVP, Winforms - EventHandlers hoặc Delegates

Tôi sắp bắt đầu một dự án mới và đã thực hiện một nghiên cứu nhỏ về mẫu trực tuyến bao gồm nhiều ví dụ mẫu ở đây và thông báo rằng tất cả các EventHandler đều sử dụng để thông báo cho người thuyết trình.

Tôi thực sự không hiểu tại sao sự kiện sẽ được sử dụng trong trường hợp này, vì tôi thấy chế độ xem chỉ có một người trình bày.

Câu hỏi của tôi là, vì mục đích này vẫn còn phù hợp với cách khung .Net sử dụng sự kiện hoặc vì một lý do nào khác mà tôi không thấy?

Dưới đây là một ví dụ nhỏ của mô hình tôi sử dụng:

public interface IViewAbstraction 
{ 
    public ModelData ModelData { set; } 
    public Action<ModelData> ModelDataChangedCallback { set; } 
} 

public class SomeWinForm : Form, IViewAbstraction 
{ 
    private Action<ModelData> modelDataChanged; 
    private ModelData model; 

    public ModelData ModelData 
    { 
     set { /* when this property changes, update UI */ } 
    } 

    public Action<ModelData> ModelDataChangedCallback 
    { 
     set { modelDataChanged = value; } 
    } 

    private void OnSomeWinformsEvent(EventArgs args) 
    { 
     if (modelDataChanged == null) throw new Exception(); 

     modelDataChanged(model); 
    } 
} 

public class Presenter 
{ 
    private readonly IViewAbstraction view; 
    private readonly IDataLayerAbstraction dataLayer; 

    public Presenter(IViewAbstraction view, IDataLayerAbstraction dataLayer) 
    { 
     this.dataLayer = dataLayer; 
     this.view = view; 
     this.view.ModelDataChangedCallback = OnModelChanged; 
     this.view.ModelData = dataLayer.GetData(); 
    } 

    private void OnModelChanged(ModelData data) 
    { 
     // validate and save data. 
    } 
} 

Trả lời

4

mô hình của bạn là về cơ bản giống như sử dụng các sự kiện, với một sự khác biệt quan trọng. Sự kiện không hiển thị đại biểu cơ bản (ModelDataChangedCallback trong ví dụ của bạn). Phơi bày điều này là thực hành không tốt vì các mã khác có thể xóa danh sách yêu cầu ví dụ. Một sự kiện sẽ có một ủy nhiệm cơ bản có thể được thêm vào hoặc bị xóa khỏi, nhưng không bao giờ bị xóa khỏi phạm vi của lớp.

Tôi không hiểu ý kiến ​​của bạn về việc không có nhiều người đăng ký - đây không phải là lý do để không sử dụng sự kiện. Một sự kiện chỉ là một cách cho một lớp học để nói "Này! Điều này đã xảy ra", một bản đồ 1-to-1 với một đối tượng Presenter là hoàn toàn hợp lý và bình thường.

Bạn cũng không kết thúc với thuộc tính chỉ ghi thay thế lạ đó trong chế độ xem.

+0

Đồng ý về các thuộc tính chỉ ghi, nó gây lỗi cho tôi khi tôi nhìn thấy chúng và thêm mã bản mẫu nhiều hơn tôi muốn cho các chế độ xem phức tạp. –

+0

Nhưng khi sử dụng một sự kiện, anh ta sẽ phải tạo một lớp 'ModelDataChangedEventArgs' cụ thể chỉ để chứa dữ liệu mà Người trình bày cần làm việc, đúng không? Khi có rất nhiều sự kiện, số lượng các lớp tấm nồi hơi sẽ lộ ra. Tất cả 'Action MyDelegate' phải được thay đổi thành' EventHandler MyEvent'… Vì nó là bản đồ 1: 1, xác suất của ai đó để xóa danh sách yêu cầu nên rất hạn chế… –

Các vấn đề liên quan