MVP, WinForms - как избежать раздутого представления, презентации и модели презентации - PullRequest
4 голосов
/ 31 мая 2010

При реализации шаблона MVP в winforms я часто нахожу раздутые интерфейсы представления со слишком большим количеством свойств, сеттеров и геттеров. Простой пример с представлением с 3 кнопками и 7 текстовыми полями, все из которых имеют значения, включенные и видимые свойства, отображаемые в представлении. Для этого добавьте результаты проверки, и вы можете легко получить интерфейс с 40-ю свойствами. Используя презентационную модель, будет модель с таким же количеством свойств.

Как вы легко синхронизируете представление и модель презентации, не имея раздутой логики презентатора, которая передает все значения вперед и назад? (С этим 80-строчным кодом презентатора представьте себе, что тест презентатора, который моделирует модель, и вид будут выглядеть как исходные строки кода просто для того, чтобы смоделировать эту передачу.) Существует ли какая-либо структура для обработки этого без обращения к привязке данных winforms? (Возможно, вы захотите использовать представления, отличные от представлений winforms. По мнению некоторых, эта синхронизация должна быть работой докладчиков ...) Вы бы использовали AutoMapper?

Может быть, я задаю неправильные вопросы, но мне кажется, что MVP легко раздулся без какого-либо хорошего решения здесь ...

1 Ответ

3 голосов
/ 01 июня 2010

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

Если вы используете много стандартного кода, заключите его в капсулу.

public class UiField<ContentType>
{
    public bool IsEnabled { get; set; }
    public ContentType Value { get; set; }
    public bool IsVisible { get; set; }
}

По вашему мнению, тогда:

public interface ISampleView
{
    UiField<bool> IsStaffFullTime { get; set; }
    UiField<string> StaffName { get; set; }
    UiField<string> JobTitle { get; set; }
    UiField<int> StaffAge { get; set; }
    UiField<IList<string>> Certifications { get; set; }
}

Здесь вы сворачиваете различные свойства, связанные с каждым полем.

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

...