Книга: 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, так как мы будем просто игнорировать все вновь созданные методы.

Оглавление книги


Генерация: 1.569. Запросов К БД/Cache: 3 / 1
поделиться
Вверх Вниз