В моих приложениях я всегда заканчиваю тем, что внедряю шаблон 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, и тогда он пропустит многократное повторение работы без причины.
Кто-нибудь придумал что-нибудь более изящное для этой задачи?