Лучший способ справиться с объектом скрепа экрана - PullRequest
1 голос
/ 12 октября 2009

В моих приложениях я всегда заканчиваю тем, что внедряю шаблон Model-View-Presenter, и обычно заканчиваю тем, что удаляю мой объект View с экрана со свойством get.

Например

Person IBasicRegistration.Person
{
 get
 {
  if (ViewState["View.Person"] == null)
   ViewState["View.Person"] = new Person();

  var Person = (Person) ViewState["View.Person"];

  Person.Email = txtEmail.Text.Trim();
  Person.FirstName = txtFirstName.Text.Trim();
  Person.LastName = txtLastName.Text.Trim();
  Person.Zip = txtZip.Text.Trim();
  Person.Phone = txtPhone.Text.Trim();
  Person.ResidentPersonLicenseState = 
        EnumerationParser.Parse<States?>(ddState.SelectedValue);

  return Person;
 }
}

Однако во время отладки я заметил, когда я получаю доступ к IBasicRegistration.Person в моем Presenter / Model, что я получаю довольно много обходов моего свойства get {}.

Я начал думать, что этот шаблон очень похож на шаблон INotifyPropertyChanged, и я начал думать о реализации аналогичного шаблона и о том, чтобы каждое текстовое поле реализовывало событие OnChanged, которое обновляло бы его связанное значение в объекте person, который находится в состоянии просмотра. Кроме того, я подумал о том, что для этого требуются многочисленные запросы к серверу каждый раз, когда человек выходит из поля, и кажется, что в какой-то момент это может привести к проблемам с масштабируемостью.

Моя следующая мысль будет иметь смысл создать флаг IsDirty и обернуть мой код там, где он касается полей, подобных:

Person IBasicRegistration.Person
{
 get
 {
  if (ViewState["View.Person"] == null)
   ViewState["View.Person"] = new Person();

  var Person = (Person) ViewState["View.Person"];

  if(IsDirty)
  {
      Person.Email = txtEmail.Text.Trim();
      ...others

      IsDirty = false;
  }

  return Person;
 }
}

И установите для любого метода, который вызывает сообщение обратно (то есть, как правило, просто кнопку отправки), чтобы установить IsDirty = true, и тогда он пропустит многократное повторение работы без причины.

Кто-нибудь придумал что-нибудь более изящное для этой задачи?

1 Ответ

2 голосов
/ 16 октября 2009

Я думаю, что в данном случае разъединение заключается в том, что вы обычно реализуете представление, а в своем представлении вы создаете представление. Типичный сценарий заключается в том, что форма реализует интерфейс представления и затем регистрируется (или регистрируется) в объекте приложения. Затем в любое время вам нужно выяснить, что было введено для человека, вы используете различные свойства представления.

Например, чтобы узнать, что вы ввели для первого имени, вы бы пошли

 myVariable = PersonView.FirstName();

В вашем примере вы проверяете СОСТОЯНИЕ представления каждый раз, когда вы получаете доступ к человеку. Даже если вы просто хотели получить электронное письмо, вы извлекаете все и помещаете его в переменную состояния.

Теперь это, если структура данных Person была частью вашей модели. Тогда это может быть хорошо. Вы вытаскиваете человека один раз, когда он меняется. Измените или добавьте его в модель, тогда все остальное (отчеты и т. Д.) Будет смотреть на модель.

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...