Симон Робинсон - C# для профессионалов. Том II
Клиент приложения предварительного заказа помещения для проведения мероприятия
Используемый клиент является разработкой приложения Web PCSWebApp3 из предыдущей главы. Назовем это приложение PCSWebApp4 и воспользуемся кодом из PCSWebApp3в качестве начальной точки.
Сделаем два существенных изменения в проекте. Первое: удалим все непосредственные обращения к базе данных из этого приложения и воспользуемся вместо этого службой Web. Второе: введем хранилище уровня приложения из DataSet, возвращаемого из службы Web, которое обновляется только в случае необходимости, это значит, что на базу данных падает меньшая нагрузка.
Прежде всего в нашем новом приложении Web необходимо добавить ссылку Web на службу PCSWebSrv2/Service1.asmx. Это можно сделать точно таким же образом, как мы видели ранее в этой главе, определяя местонахождение файла .vsdisco и вызывая его eventDataService.
После этого добавляем код в Global.asax, по большей части, таким же образом, как это было сделано для службы Web. Этот код, однако, будет существенно проще. Сначала мы ссылаемся на службу Web и пространство имен System.Data:
namespace PCSWebApp4 {
...
using System.Data;
using eventDataService;
Затем заполняем множество данных (dataset) и помещаем его в хранилище данных уровня приложения с именем ds:
protected void Application_Start(Object sender, EventArgs e) {
Service1 dataService = new Service1();
DataSet ds = dataService.GetData();
Application["ds"] = ds;
}
Теперь DataSet доступно для всех экземпляров PCSWebApp4, т.е. несколько пользователей могут читать данные без какого-либо обращения к службе Web, то есть к базе данных.
Теперь, когда имеется это DataSet, необходимо изменить WebForm1.aspx.cs для его использования. Прежде всего можно удалить объявления oleDbConnection1, daAttendees, daRooms и daEvents, так как не будет осуществляться никакого обращения к базе данных. Затем необходимо изменить Page_Load() следующим образом:
private void Page_Load(object sender, System.EventArgs e) {
validationSummary.Enabled = false;
foreach (System.Web.UI.WebControls.WebControl validator in this.Validators) {
validator.Enabled = false;
}
ds = (DataSet)Application["ds"];
attendeeList.DataSource = ds.Tables["Attendees"];
roomList.DataSource = ds.Tables["Rooms"];
eventTable = ds.Tables["Events"];
eventDetails1.DataSource = eventTable; eventDetails2.DataSource = eventTable;
if (!this.IsPostBack) {
System.DateTime trialDate = System.DateTime.Now;
calendar.SelectedDate = getFreeDate(trialDate);
this.DataBind();
} else {
eventDetails1.DataBind();
eventDetails2.DataBind();
}
}
Большая часть кода остается без изменений, необходимо только использовать Application["ds"] вместо получения DataSet.
Необходимо также изменить submitButton_Click() для использования метода AddData() службы Web. В этом случае также большая часть кода остается без изменений:
protected void submitButton_Click(object sender, System.EventArgs e) {
foreach (System.Web.UI.WebControls.WebControl validator in this.Validators) {
validator.Enabled = true;
}
this.Validate();
if (this.IsValid) {
String attendees = "";
foreach (ListItem attendee in attendeeList.Items) {
if (attendee.Selected) {
attendees += attendee.Text + " (" + attendee.Value + "), ";
}
}
attendees += " and " + nameBox.Text;
String dateString = calendar.SelectedDate.Date.Date.ToShortDateString();
Service1 dataService = new Service1();
int queryResult =
dataService.AddEvent(eventBox.Text, roomList.SelectedItem.Value,
attendees, dateString);
if (queryResult == 1) {
resultLabel.Text = "Event Added";
ds = dataService.GetData();
Application.Lock();
Application["ds"] = da;
eventTable = ds.Tables["Events"];
calendar.SelectedDate = getFreeDate(calendar.SelectedDate.AddDays(1));
eventDetails1.DataSource = eventTable;
eventDetails1.DataBind();
eventDetails2.DataSource = eventTable;
eventDetails2.DataBind();
} else {
resultLabel.Text = "Event not added due to DB access problem.";
}
} else {
validationSummary.Enabled = true;
}
}
Фактически, мы существенно упростили систему. Это часто бывает при правильном проектировании служб Web — можно забыть о большей части работы приложения и вместо этого сосредоточиться на работе пользователя.
К этому коду почти не требуется комментариев. Продолжающееся использование queryResult является дополнительной премией, а блокирование приложения существенно, как уже было отмечено.
Приложение Web PCSWebApp4 выглядит и функционирует точно также, как PCSWebApp3, но выполняется существенно лучше. Можно также очень легко использовать эту же службу Web для других приложений, просто выводя на странице мероприятия, например, или редактируя мероприятия, имена почетных гостей и помещения, если добавить несколько других методов. Все это не разрушит PCSWebApp4, так как мы будем просто игнорировать все вновь созданные методы.
Заключение
В этой главе мы увидели, как создавать и использовать службы Web с помощью C# и платформы разработки VS.NET. Сделать это достаточно просто, но какая это невероятно полезная возможность. Уже сейчас мы видим множество объявлений о новых службах Web и можно ожидать, что скоро они будут повсюду.
Также было отмечено, что службы Web могут быть доступны с любой платформы. Это связано с простотой протокола SOAP, который не ограничивается платформой .NET.
Пример, разработанный в этой главе, иллюстрирует, как можно легко создавать распределенные приложения .NET. Здесь предполагается, что для тестирования используется один сервер, но почему бы службу Web полностью не отделить от клиента. Она может даже находиться на отдельном от базы данных сервере, если требуется дополнительная связь данных.
Использование кэширования данных является другой важной техникой, которую необходимо освоить для использования в крупномасштабных приложениях, когда имеются тысячи одновременно присоединяющихся пользователей. Конечно, в такой ситуации использование Microsoft Access в качестве источника данных может оказаться не лучшей идеей.
Наконец, стоит помнить, что потребителями службы Web не обязательно должны быть приложения Web. Нет причин, по которым нельзя использовать службы Web из приложений платформы Windows, что может оказаться привлекательным для корпоративных сетей интранет.
Глава 18
Специальные элементы управления
При разработке приложений Web случаются ситуации, когда доступные мощные инструменты разработки не вполне соответствуют требованиям для определенного проекта. Возможно, что заданный элемент управления работает не вполне так, как это требуется, или раздел кода, предназначенный для повторного использования на нескольких страницах, слишком сложен в руках нескольких разработчиков. В таких ситуациях существуют серьезные доводы в пользу специальных элементов управления. Специальные элементы управления могут, в самом простейшем виде объединить несколько существующих элементов управления вместе, возможно, с дополнительными свойствами, определяющими компоновку, или могут полностью отличаться от любых существующих элементов управления. Использование специального элемента управления настолько же просто, как и использование любого другого элемента управления в ASP.NET, что, конечно, облегчает кодирование web-сайтов.
В прошлом было сложно реализовывать такие специально созданные элементы управления, особенно в крупномасштабных системах, где требовались сложные процедуры регистрации для их использования. Даже в простых системах требования кодирования для создания специального элемента управления могли существенно усложнить процесс. Языки сценариев старых языков разработки Web также страдали от отсутствия возможности предоставить полноценный доступ к искусно созданной объектной модели, что приводило к низкой производительности в целом.
Платформа .NET предоставляет идеальное окружение для создания специальных элементов управления. Динамическое обнаружение сборок, что свойственно системе .NET делает установку на новом сервере Web посредством копирования структуры каталогов, содержащей код, вместе со всеми используемыми DLL. Кроме того, специальное внимание было уделено упрощению создания своих собственных элементов управления с помощью простых технологий программирования.
В этой главе мы рассмотрим два различных вида элементов управления:
□ Элементы управления пользователя — преобразование существующих страниц ASP.NET в элементы управления
□ Специальные элементы управления — объединение функций нескольких элементов управления, расширение существующих элементов управления и создание новых элементов управления с самого начала