Просто пытаюсь собрать мысли о том, что работает / не работает для манипулирования объектами Business / Domain через слой пользовательского интерфейса / презентации ASP.NET (2.0+). В частности, в классических прикладных ситуациях ASP.NET LOB, когда код ASP.NET взаимодействует напрямую с бизнес-уровнем. Я сталкиваюсь с этим типом дизайна довольно часто и задаюсь вопросом, что является идеальным решением (то есть, реализует определенный шаблон) и каково лучшее прагматическое решение, которое не потребует полного переписывания, когда не реализован «шаблон».
Вот пример сценария.
Одна страница ASP.NET, которая является страницей «Редактировать / Новая» для конкретного объекта «Бизнес / Домен», давайте в качестве примера рассмотрим «Лицо». Мы хотим редактировать информацию об имени и адресе на этой странице. Поскольку пользователь вносит изменения или вводит данные, в некоторых ситуациях форма должна быть отправлена обратно, чтобы обновить себя. Например, при редактировании своего адреса они выбирают «Страна». После этого раскрывающийся список «Штат / регион» включается и обновляется соответствующей информацией для выбранной страны. По сути, это бизнес-логика (ограничение доступных выборов на основе некоторого зависимого поля), и эта логика обрабатывается бизнес-уровнем (помните, что это только один пример, есть много бизнес-ситуаций, когда логика более сложна во время обратной передачи - для Пример страховой отрасли при выборе определенных вещей диктует, какие другие данные необходимы / необходимы).
В идеале эта логика хранится только в объекте Business / Domain (т.е. без дублирования логики в коде ASP.NET). Я полагаю, что для этого необходимо повторно инициализировать объект Business / Domain и установить его состояние на основе текущих значений пользовательского интерфейса для каждой обратной передачи.
Например:
private Person person = null;
protected void Page_Load()
{
person = PersonRepository.Load(Request.QueryString["id"]);
if (Page.IsPostBack)
SetPersonStateFromUI(person);
else
SetUIStateFromPerson(person);
}
protected void CountryDropDownList_OnChange()
{
this.StateRegionDropDownList.Enabled = true;
this.StateRegionDropDownList.Items.Clear();
this.StateRegionDropDownList.DataSource = person.AvailableStateRegions;
this.StateRegionDropDownList.DataBind();
}
Другие варианты, которые я видел, хранят бизнес-объект в SessionState, а не загружают его из хранилища (или базы данных) каждый раз, когда страница загружается обратно.
Мысли