Главная » Delphi » Использование DataSnap для создания приложений

0

Теперь,  ознакомившись со  множеством параметров,  доступных   при  разработке приложений с использованием технологии DataSnap, попробуем применить их на практике для разработки реального приложения.

Установка сервера

Сначала  познакомимся с механизмом построения серверного приложения, а затем обсудим, как создается клиентская часть приложения.

Модуль удаленных данных (RDM)

Основу  серверного приложения составляет модуль удаленных  данных.  Чтобы соз дать модуль RDM для нового приложения, выберите пиктограмму Remote Data Module во вкладке  Multitier диалогового окна New Items (меню File пункт New). Появится диало говое  окно,  в котором можно  выполнить начальную  настройку некоторых параметров модуля удаленных данных.

Наиболее важным  параметром является имя модуля RDM, поскольку  идентификатор

ProgID для данного приложения сервера будет построен с использованием имени  проек та и имени модуля  удаленных  данных.  Например, если  проект (файл .DPR) имеет  имя AppServer, а удаленный модуль данных — MyRDM, то идентификатор ProgID будет иметь вид  AppServer.MyRDM. Убедитесь, что  для сервера корректно выбран способ  создания экземпляров и модель взаимодействия потоков.

Поскольку компоненты TSocketConnection и TWebConnection обходят стандарт ный процесс аутентификации Windows,  необходимо обязательно удостовериться в том, что  на сервере запускаются именно те объекты, которые были  определены. Для этого можно поместить в системный реестр определенные значения. Тем самым приложению DataSnap будут переданы сведения о том,  какие  именно объекты предполагается запус кать. К счастью, все, что необходимо для этого сделать, — так это переопределить метод класса  UpdateRegistry. При  создании модуля удаленных  данных  Delphi автоматиче ски создает реализацию данного метода,  показанную в листинге 21.1.

Листинг 21.1. Метод UpdateRegistry для класса модуля удаленных данных

class procedure TDDGSimple.UpdateRegistry(Register: Boolean;

const ClassID, ProgID: string);

begin

if Register then begin

inherited UpdateRegistry(Register, ClassID, ProgID);

EnableSocketTransport(ClassID);

EnableWebTransport(ClassID);

end else begin

DisableSocketTransport(ClassID);

DisableWebTransport(ClassID);

inherited UpdateRegistry(Register, ClassID, ProgID);

end;

end;Этот  метод  вызывается каждый  раз  при  регистрации или  отмене регистрации сер вера. Кроме  записей в системном реестре, соответствующих объектам СОМ и создавае мых при  вызове  унаследованного метода  UpdateRegistry, можно  вызывать также  ме тоды  EnableXXXTransport и DisableXXXTransport. Причем объект будет помечен как защищенный.НА ЗАМЕТКУ

Компонент TSocketConnection отображает в свойстве ServerName лишь зарегист- рированные защищенные объекты. Если обеспечивать безопасность не нужно, сбросьте в меню Connections утилиты SCKTSRVR флажок Registered Objects Only.

Провайдеры

Поскольку  основной задачей  сервера приложений является предоставление дан ных клиенту, необходимо обеспечить возможность передачи данных  с сервера в формате, понятном клиенту.  К счастью, реализация технологии DataSnap в Delphi  об ладает  компонентом TDataSetProvider, который  существенно упрощает решение этой задачи.

Сначала  поместите в удаленный модуль данных  компонент TQuery. Если в прило жении используется реляционная база данных, то потребуется также  и компонент TDatabase. Теперь нужно связать  компоненты TQuery и TDatabase, а затем опреде лить  в свойстве SQL простой запрос —  например select * from customer. И,  на конец, поместите в модуль удаленных  данных  компонент TDataSetProvider и свя жите  его с компонентом TQuery через свойство DataSet. Свойство Exported объек та DataSetProvider определяет, будет ли этот  провайдер видимым для клиентов. С помощью этого  свойства можно  легко управлять видимостью провайдеров и во время выполнения приложения.

НА ЗАМЕТКУ

Хотя в данном разделе основное внимание уделяется компоненту TDBDataSet, ори- ентированному на работу с BDE, этими же принципами можно руководствоваться при организации доступа к данным с помощью любого другого компонента, производного от компонента TDataSet. В эту категорию входят также компоненты dbExpress, ADO и InterBase Express, рассмотрение которых выходит за рамки настоящей книги.

Регистрация сервера

После  создания приложения сервера его необходимо зарегистрировать как объект СОМ,  что  сделает  его  доступным  клиентским приложениям. Способы регистрации, обсуждавшиеся в главе 15, “Разработка приложений COM”, вполне применимы и в случае серверов DataSnap. Достаточно запустить приложение сервера — и требуемый параметр будет добавлен в системный реестр. Но, прежде чем регистрировать сервер, необходимо сохранить проект. Это гарантирует, что,  начиная с данного момента, бу дет использоваться корректный идентификатор ProgID.

Если приложение необходимо запустить лишь для регистрации, а не для реальной

работы, то при запуске задайте в командной строке параметр /regserver. При  этом будет выполнен процесс регистрации, после  чего приложение немедленно завершит ся. Чтобы удалить параметры системного реестра, связанные с данным  приложением, укажите в командной строке параметр /unregserver.

Создание клиента

Теперь, когда существует  работоспособное серверное приложение, рассмотрим основные задачи,  выполняемые при  создании клиента. Обсудим,  как возвращать дан ные,  как их редактировать, как обновлять базу данных  с учетом  изменений, выпол ненных клиентом, и, наконец, как обработать ошибки, возникающие в процессе об новления.

Возвращение данных

В процессе работы приложения баз данных  необходимо постоянно передавать данные  от сервера клиенту  для их редактирования. Помещение данных  в локальный кэш снижает нагрузку на сеть и минимизирует время  выполнения транзакций. В пре дыдущих  версиях Delphi для решения этой  задачи  приходилось использовать кэши рование обновлений. В целом  аналогичные решения применяются и в приложениях DataSnap.

Клиент взаимодействует с сервером через компонент TDispatchConnection. Эту задачу можно  легко  решить, поместив в компонент TDispatchConnection имя ком пьютера, на котором расположен сервер. При использовании компонента TDCOMCon- nection можно    задать   полностью  квалифицированное   имя   домена    (например nt.dmiser.com),  IP адрес  компьютера  (к  примеру  192.168.0.2)  или  его  имя  в NetBIOS  (например nt). В протоколе DCOM существует ошибка, поэтому  имя local- host использовать не рекомендуется. При  использовании компонента TSocketCon- nection в свойстве Address задаются IP адреса,  а в свойстве Host — полностью ква лифицированное имя  домена.  О  параметрах компонента TWebConnection погово рим немного позже.

Задав местоположение приложения сервера, необходимо предоставить компоненту TDispatchConnection способ  его  идентификации.  Это  можно   сделать   с  помощью свойства ServerName. При  установке значения свойства ServerName автоматически заполняется свойство ServerGUID, которое является очень  важным.  В самом  общем случае, если клиентское приложение подлежит распространению, следует удалить зна чение из свойства ServerName, оставив значение лишь в свойстве ServerGUID.

НА ЗАМЕТКУ

При использовании компонента TDCOMConnection в свойстве ServerName будет ото- бражаться список серверов, зарегистрированных на данном компьютере. Однако ком- понент TSocketConnеction является более “интеллектуальным” и отображает список серверов, зарегистрированных на удаленной машине.

Наконец, чтобы реально установить соединение с приложением сервера, устано

вите значение свойства TDispatchConnection.Connected равным True.

Теперь,  когда  клиент  соединен  с  сервером,  необходимо  определить  способ  ис

пользования провайдера сервера. Для этого  воспользуйтесь компонентом TClient- DataSet. Данный компонент применяется для  связи  с провайдером (а  значит, и  с компонентом TQuery, который тоже связан  с провайдером) на сервере.

Прежде всего  необходимо связать   компонент TClientDataSet с  компонентом

TDispatchConnection,  установив  соответствующее  значение  свойства  Remote-Server компонента TClientDataSet. В результате в свойстве ProviderNаme будет содержаться список доступных  провайдеров выбранного сервера.

С этого  момента все готово, чтобы  открыть набор данных клиента ClientDataSet

(CDS — Client  Data Set).

Поскольку компонент TClientDataSet является потомком виртуального класса TDataSet, для него можно  применять большинство из приемов, рассмотренных при обсуждении использования компонента TDBDataSet в приложениях клиент/сервер. Например, установка  значения свойства Active равным True приведет к открытию компонента TClientDataSet и  отображению данных.  Единственным отличием от установки свойства TTable.Active является то,  что  компонент TClientDataSet получает необходимые данные  от приложения сервера.

Источник: Тейксейра, Стив, Пачеко, Ксавье.   Borland Delphi 6. Руководство разработчика. : Пер.  с англ. — М. : Издательский дом “Вильямс”, 2002. —  1120 с. : ил. — Парал. тит. англ.

По теме:

  • Комментарии