Бизнес-объекты на базе типизированных спецколлекций
Здесь будет описано создание бизнес-объекта на базе типизированных спецколлекций. Типичный пример такого бизнес-обьекта - корзина электронного магазина. Как правило, внутри бизнес-обьекта есть DataSet, который заполняется каким-то образом с локальной машины, или через Веб-сервис. В данном случае DataSet хранит детальную информацию о товаре.
Такой метод изготовления бизнес-объектов, позволяет НАПРЯМУЮ выводить их в GridView и даже в режиме прямого редактирования. Высокоуровневый интерфейс GridView позволяет реализовать даже редактирование всего в несколько строк. Утилизация всех бизнес обьектов, созданных во всех сеансах пользователей на ходу может быть произведена в Application, однако конечно весь смысл заключается в сохранении корзины в SQL с ключом профиля пользователя. Техники сохранения зависят от принятого метода аутентификации.
Пример кода бизнес-обьекта (ДатаСет заполняется с локальной машины).
Теперь посмотрим конкретный пример странички выбора товара на базе вышеописанного бизнес-обьекта. Обратите внимание, что весь магазин в этом случае выглядит всего из нескольких строчек.
Сделаем этот пример не на GridView как было выше, а на DataList. Шаблон элемента DataList создается буквально в два клика мышкой и будет в данном случае состоять из кнопки и контрола, который умеет в виде дерева выводить свойства товара.
Теперь собственно код, состоящий всего из несокольких строчек, но который наглядно демонстрирует преимущества собственного бизнес-объекта:
00001: 00002: Partial Class _Default 00003: Inherits System.Web.UI.Page 00004: 00005: Dim WithEvents WorkNodes As New SH.WorkingTovarList 00006: 00007: Protected Sub Page_Init(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Init 00008: If Not (Session("WorkNodes") Is Nothing) Then WorkNodes = Session("WorkNodes") 00009: End Sub 00010: 00011: Protected Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load 00012: If Not Me.IsPostBack Then 00013: DataList1.DataSource = WorkNodes 00014: DataList1.DataBind() 00015: 'заполним данными все элементы коллекций 00016: For Each Y As SH.WorkingTovar In WorkNodes 00017: If Not Y.IsHaveData Then Y.ReadFromSQL() 00018: Next 00019: Else 00020: For Each Y As SH.WorkingTovar In WorkNodes 00021: If Request.QueryString("i") = Y.TovarValue Then Y.chTovarKorsina = True 00022: Next 00023: End If 00024: End Sub 00025: 00026: Protected Sub DataList1_ItemDataBound(ByVal sender As Object, ByVal e As System.Web.UI.WebControls.DataListItemEventArgs) Handles DataList1.ItemDataBound 00027: 'сначала находим внутри шаблона нужный контрол 00028: For Each X As System.Web.UI.Control In e.Item.Controls 00029: If X.GetType.Name = "control_tovardetails_ascx" Then 00030: 'теперь собственно выполняем привязку вручную 00031: CType(X, ASP.control_tovardetails_ascx).OneTovar = CType(e.Item.DataItem, SH.WorkingTovar) 00032: End If 00033: If X.GetType.Name = "ImageButton" Then 00034: CType(X, ImageButton).PostBackUrl = Me.AppRelativeVirtualPath & "?i=" & CType(e.Item.DataItem, SH.WorkingTovar).TovarValue 00035: End If 00036: Next 00037: End Sub 00038: 00039: End Class
Как видите, здесь приходится выполнять ручную привязку DataListItem. Этот простейший код всего из нескольких строчек обеспечивает вот такую функциональность:
А зайдя на страничку обзора корзины (которая была описана в первых строчках) - которая даже кода конкретно не содержит, ибо GridView была как вы видите, привязана декларативно в Дизайн-тайме, мы получаем следующую картинку (разумеется щелкнув на кнопках с корзиной):
Мда... Налицо действително триумф микрософтовских технологий (хоть и крайне тяжеловесных). Но все это было сделано буквально минут за пять, причем с отличным IntelliSense-сервисом:
Заметьте, что здесь не поднимался вопрос, каким образом был заполнен Session("WorkNodes") при входе на эту страничку - это можно делать либо по предварительно записанным Cookie (если клиент уже посещал этот магазин, либо по списку приоритетов для продаже, либо даже подключив систему отбора похожего товара от того, каким интересовался посетитель при прошлых посещениях (как например сделано на Амазоне) - это предмет уже другого обсуждения, не связанного с удобством использования собственных бизнес-объектов, рассмотренного на этой страничке.
|