2010-03-14 4 views
6

Если представление не имеет ничего конкретного в своем интерфейсе и вызывает простые методы презентатора для обработки событий и не имеет каких-либо официальных EventHandlers? НапримерWebforms MVP Пассивный просмотр - обработка событий

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

Или вид у EventHandlers событий определены в интерфейсе и связать эти вверх явно контролировать события на странице

// 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; 
    } 

Второй кажется, много сантехнического кода, чтобы добавить повсюду.

Мое намерение состоит в том, чтобы понять преимущества каждого стиля, а не просто полный ответ на его использование. Мои основные цели - ясность и высокая ценность. Важна общая тестируемость, но я бы не стал жертвовать простотой и ясностью дизайна, чтобы иметь возможность добавлять еще один тип теста, который не приводит к слишком большому выигрышу по сравнению с уже имеющимися тестовыми примерами с более простым дизайном. Если выбор дизайна отличается большей тестируемостью, пожалуйста, включите пример (псевдокод в порядке) того типа теста, который он теперь может предложить, поэтому я могу принять решение, если я достаточно ценю этот тип дополнительного теста. Благодаря!

Обновление: У меня вопрос о необходимости уточнения?

ответ

-3

В интерфейсе вашего представления вы должны иметь ссылку на кнопку сохранения, а затем все делается в настоящем. Это не дает вашему представлению свободного кода, и ваш preseneter легко тестируется.

// 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

Мы только реализовать MVP, используя веб-форму, и выбрали более простой вариант иметь методы просмотра вызовов на ведущий непосредственно на кнопки событий и т.д.

Наше оправдание в том, что мы не можем самостоятельно тестировать представление напрямую (мы используем waitin для тестирования этого слоя), поэтому главная цель здесь - иметь единый тестируемый презентатор, который отделен, насколько это возможно, от представления/модели.

По моему опыту, вы никогда не достигнете полностью чистого MVP в WebForms в любом случае из-за природы зверя (им действительно понравится использовать этот код за файлом ...), поэтому я бы «Не зацикливайтесь на нем.

В конце концов, вы должны оценить причины, выделяющий вид и логику представления и определить, собирается ли любой из этих методов, чтобы помочь/мешать вам позже ....

6

Я не» t как иметь ясную ссылку на кнопку (или любой другой элемент управления) в интерфейсе. Это означает, что мы тесно связаны с реализацией контроля (ов).

Элементы управления могут быть реализованы по-разному между типами проектов (например, Winforms и ASP).

Это означает, что интерфейс, возможно, необходимо будет изменить для разных видов, что мы и не хотим. Весь смысл MVP заключается в том, что Presenter может полагаться на стабильный интерфейс, который позволяет отделить пользовательский интерфейс от модели, легко подменять конкретные взгляды и тестируемость.

Лучше придерживаться свойств и методов интерфейса, которые не зависят от каких-либо конкретных элементов управления и оставляют детали реализации конкретным представлениям.

Смежные вопросы