2010-03-14 20 views
6

Nếu khung nhìn không có sự kiện cụ thể trong giao diện của nó và gọi phương thức đơn giản của người trình bày để xử lý sự kiện và không có bất kỳ EventHandlers chính thức nào? Ví dụWebforms MVP Passive View - xử lý sự kiện

// ASPX 
protected void OnSaveButtonClicked(object sender, EventArgs e) 
{ 
    _Presenter.OnSave(); 
} 

Hoặc nên quan điểm đã EventHandlers kiện quy định tại giao diện của nó và liên kết những lên một cách rõ ràng để kiểm soát các sự kiện trên trang

// View 
    public interface IView 
    { 
... 
     event EventHandler Saved; 
... 
    } 

// ASPX Page implementing the view 
    protected override void OnInit(EventArgs e) 
    { 
     base.OnInit(e); 
     SaveButton.Click += delegate { Saved(this, e); }; 
    } 

// Presenter 
    internal Presenter(IView view,IRepository repository) 
    { 
     _view = view; 
     _repository = repository; 
     view.Saved += Save; 
    } 

Thứ hai có vẻ như một toàn bộ rất nhiều mã hệ thống ống nước để thêm trên tất cả.

Mục đích của tôi là hiểu được lợi ích của từng phong cách chứ không phải chỉ là câu trả lời trong đó sử dụng. Mục tiêu chính của tôi là sự rõ ràng và khả năng kiểm tra giá trị cao. Testability tổng thể là quan trọng, nhưng tôi sẽ không hy sinh thiết kế đơn giản và rõ ràng để có thể thêm một loại thử nghiệm mà không dẫn đến tăng quá nhiều trong các trường hợp thử nghiệm đã có thể với một thiết kế đơn giản. Nếu một lựa chọn thiết kế không có khả năng thử nghiệm nhiều hơn, vui lòng bao gồm một ví dụ (mã giả là tốt) của loại thử nghiệm mà bây giờ nó có thể cung cấp để tôi có thể đưa ra quyết định nếu tôi đánh giá đủ loại thử nghiệm đó. Cảm ơn!

Cập nhật: Câu hỏi của tôi có cần làm rõ thêm không?

Trả lời

-3

Trong giao diện của chế độ xem, bạn phải có tham chiếu đến nút lưu và sau đó mọi thứ được thực hiện trong trình bày. Điều này giữ cho chế độ xem của bạn không có mã và trình preseneter của bạn dễ dàng kiểm tra được.

// View interface 
public interface IView 
{ 
    Button SaveButton; 
} 

// View code behind 
public Button SaveButton 
{ 
    get { return btnSave; } 
} 

// Presenter 
internal Presenter(IView view,IRepository repository) 
{ 
    _view = view; 
    _repository = repository; 
    view.SaveButton.Click += new EventHandler(Saved);; 
} 

void Saved(object sender, EventArgs e) 
{ 
    // do save 
} 

'

1

Chúng tôi vừa thực hiện MVP sử dụng webforms, và chọn cho tùy chọn đơn giản của việc có phương pháp xem cuộc gọi trên người dẫn chương trình trực tiếp cho các sự kiện nút, vv

biện minh của chúng tôi là chúng tôi không thể kiểm tra trực tiếp đơn vị (chúng tôi sử dụng waitin để thử nghiệm lớp này), vì vậy mục tiêu chính ở đây là có một người trình bày có thể kiểm tra đơn vị được tách ra xa nhất có thể từ chế độ xem/mô hình.

Từ kinh nghiệm của mình, bạn sẽ không bao giờ đạt được MVP hoàn toàn sạch trong WebForms do tính chất của con thú (chúng thực sự yêu bạn chỉ sử dụng mã đó đằng sau tệp ...), vì vậy tôi sẽ không bị treo trên đó.

Vào cuối ngày, bạn cần phải đánh giá những lý do để tách ra quan điểm và trình bày logic và xác định xem một trong hai phương pháp sẽ giúp/cản trở bạn sau này ....

6

I don' t giống như có một tham chiếu rõ ràng đến một Button (hoặc bất kỳ điều khiển khác) trong giao diện. Điều này có nghĩa là chúng tôi bị ràng buộc chặt chẽ với việc thực hiện (các) điều khiển.

Điều khiển có thể được triển khai rất khác nhau giữa các loại dự án (ví dụ như Winforms và ASP).

Điều này có nghĩa là giao diện có khả năng cần phải được sửa đổi cho các chế độ xem khác nhau chính xác là những gì chúng tôi không muốn. Toàn bộ điểm của MVP là Presenter có thể dựa vào một giao diện ổn định cho phép tách giao diện người dùng khỏi mô hình, dễ dàng thay thế các khung nhìn cụ thể và khả năng kiểm thử.

Tốt hơn nên gắn bó với các thuộc tính và phương thức trên giao diện không phụ thuộc vào bất kỳ điều khiển cụ thể nào và để lại chi tiết triển khai cho chế độ xem cụ thể.

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