На главную
Краткое изложение идеологии
трехуровневых приложений
Трехуровневое приложение включает следующие уровни:
уровень представления
уровень бизнес-логики
уровень доступа к данным
Уровень представления обычно
представляет собой какую-либо разновидность "тонкого" (thin) клиента,
который только вызывает сервер, отображает данные и принимает ввод от
пользователя.
Уровень бизнес-логики выполняет
всю основную обработку данных. Данный уровень представляет собой
промежуточное звено между БД и клиентским приложением и может работать
как, например, монитор обработки транзакций или брокер объектных
запросов.
Уровень доступа к данным обычно
представляет собой собственно БД.
На практике эти три уровня, как правило, располагаются на разных
машинах.
Трехуровневая модель (three-tier model) позволяет обеспечить работу
гораздо большего числа клиентов, чем двухуровневая модель, состоящая
только из БД и клиентского приложения ("толстого" (fat) клиента).
Трехуровневая модель является более гибкой, т.к. при изменении
алгоритмов обработки данных часто достаточно изменить ПО на машине
промежуточного звена, которая может обслуживать множество клиентских
машин. Кроме того, мощные машины промежуточного звена могут выдерживать
значительно большие нагрузки, чем клиентские машины. Введение
промежуточного звена также облегчает синхронизацию доступа к БД.
Создание простого
трехуровневого приложения для работы с Microsoft SQL Server
Среда, используемая для создания приложения - C#Builder.
Приведенная программа, конечно, не предназначена для практического
использования и служит только в качестве примера создания трехуровневых
приложений.
В данном примере клиентское приложение будет представлено в виде
exe-файла, а уровни бизнес-логики и доступа к данным - в виде
dll-библиотек. Все три проекта поместим в одну группу проектов:
Уровень доступа к данным
- база данных Microsoft SQL Server.
Уровень бизнес-логики -
библиотеки DataAccess.dll и BusinessLogic.dll
Модуль BusinessLogic устанавливает соединение с сервером, запрашивает
данные определенного типа и отправляет запрос на сохранение изменений,
сделанных пользователем. Модуль DataAccess является реализацией класса
DataAccess, наследующего класс DataSet. Объект класса DataAccess
содержит данные, находящиеся в таблице Books.
Клиентское приложение уровня
представления
Приложение, которое мы назовем Client, будет только отображать данные и
посылать запрос на сохранение изменений, произведенных пользователем.
Схема взаимодействия между классами приложения:
Пошаговое описание создания
приложения:
1. Создаем группу проектов ProjectGroup1
2. Включаем в эту группу проектов 3 новых проекта: Client.exe (тип
application), BusinessLogic.dll (тип class library) и DataAccess.dll
(тип class library). Изменяем созданное по умолчанию пространство имен
каждого проекта на ThreeTierApp. Таким образом, все три проекта будут
находиться в одном пространстве имен.
3. Программа будет загружать данные из определенной таблицы, поэтому в
качестве примера создадим очень простую таблицу Books (например, с
помощью Enterprise Manager):
Далее создаем соединение для этой таблицы в Data Explorer
(View->Data Explorer) и перетаскиваем ее мышью на главное окно
программы. При этом автоматически создаются компоненты bdpConnection1 и
bdpDataAdapter1, которые можно использовать для генерации класса,
наследующего DataSet, который будет содержать данные из таблицы Books.
Для генерации класса, наследующего DataSet, нужно щелкнуть правой
кнопкой по компоненту bdpAdapter1 и выбрать пункт меню "Generate Typed
DataSet" (в окне диалога, появляющегося при генерации DataSet следует
убрать галочку "add this dataset to the designer", а в качестве имени
dataset указать DataAccess).
Получившийся класс DataAccess переместим в проект DataAccess.dll, т.е
поместим этот класс вместо класса, созданного по умолчанию для модуля
DataAccess, затем удалим из модуля Client файлы, связанные с dataset.
Теперь можно удалить компоненты bdpConnection1 и bdpDataAdapter1, т.к.
для соединения с БД мы будем использовать объекты классов SglConnection
и SqlDataAdapter. Конечно, можно было совсем не создавать компоненты
bdpConnection1 и bdpDataAdapter1, но тогда пришлось бы вручную писать
код доступа к таблице Books. При создании же компонентов bdpConnection1
и bdpDataAdapter1 (в результате перетаскивания таблицы из Data Explorer
на главное окно) код доступа к таблице генерируется автоматически.
4. Создаем класс BusinessLogic, который будет содержать следующий код:
Таким образом, класс BusinessLogic, размещенный в модуле BusinessLogic,
содержит ссылку на экземпляр класса DataAccess.
5. В класс WinForm (модуль Client) также помещаем ссылку на объект
класса DataAccess, который назовем dataSet Не забудьте
проинициализировать ссылку, добавив в метод InitializeComponent() строку
this.dataSet = new SimpleDataAccess();
В список зависимостей модулей Client и BusinessLogic (Project
Manager->References) добавляем библиотеку DataAccess.dll. А для
модуля Client добавляем также ссылку на BusinessLogic.dll.
6. Создаем интерфейс для приложения Client: помещаем на главное окно
приложения элемент DataGrid и две кнопки: Load и Save. Для элемента
DataGrid в качестве источника данных (свойство DataSource) указываем
dataSet.
Добавляем код, обрабатывающий события, возникающие при нажатии на
кнопку Load или на кнопку Save: