Программирование в IIS
Аутентификационные данные подключения к базе данных
Общей проблемой VB-приложений является неправильная поддержка абстракции логики. Если класс clsChair создан для чтения и записи данных в источник типа базы данных, то программист может включить в этот класс свойство Connection. Свойство Connection предоставляет классу информацию, необходимую для подключения к базе данных. Такой подход нежелателен, потому что возникают проблемы с расширяемостью интернет-приложений, написанных на языке VB. Интерфейс класса не отражает реальное положение дел, поскольку объект "стул" не имеет атрибута Connection на самом деле. Размещая свойство Connection в интерфейсе, программист предполагает, что потребителю класса известно, каким образом класс взаимодействует с источником данных. Атрибут Connection и подобные технические атрибуты не должны вредить интерфейсу. Здесь правильным решением является абстрагирование в бизнес-логике от всего, что не относится к объекту в реальной жизни.Как программист может обеспечить "чистоту" логической абстракции класса и реализовать подключение к базе данных? Ввод вручную информации о подключении в классе, разумеется, не выход из положения, так как требует изменения кода. Всякое программное обеспечение должно иметь параметры состояния, доступные при инициализации или конструировании. Для сервера Windows механизмом хранения данных состояния или инициализации является реестр, который используется всеми утилитами и службами поддержки Windows. Технология .NET унаследовала использование файлов XML для хранения данных о развертывании и состоянии интернет-приложений.
Любая система работает до тех пор, пока программному обеспечению известен контекст хранения данных инициализации. Реестр Windows отыскивается всегда одинаково, независимо от узла его расположения. Программа не должна искать реестр на диске C:, ведь на другом сервере он может располагаться в другом месте. Реестр обладает контекстом, связанным с самим узлом, а не с положением файла на узле, внутри сервера или внутри сервера на отдельном узле.
В интернет-приложениях корневой веб-каталог выступает в роли общего узла контекста. К содержимому или файлам можно обращаться в контексте корневого веб-каталога. Он может располагаться на диске C: или D:, и при выражении контекста как корневого веб-каталога не возникнет проблем, связанных с нахождением значения данного параметра инициализации. Платформа .NET унаследовала стандарт хранения данных развертывания в файлах XML с именем Web.config, которые располагаются в любом каталоге структуры веб-каталогов. Более подробная информация о приложениях .NET и использовании файла web.config приведена в лекциях 2 и 3.
Так как класс clsChair размещен в приложении COM+, то реализован интерфейс IobjectConstruct для получения аутентификационных данных при подключении к базе данных. Для его использования в список ссылок проекта класса добавлена ссылка COM+ Services Type Library (см. рис. 1.7).
Интерфейс IObjectConstrucion реализован с использованием команды Implements, и в класс добавлена подпрограмма события IObjectConstruct_Construct. Эта подпрограмма выполняется при инициализации класса и передает экземпляр объекта классу, представляемому параметром pCtorObj. Экземпляр класса, на который указывает pCtorObj, имеет свойство ConstructString. Значение ConstructString использовалось для инициализации объекта ADO Connection, повсеместно применяемого в классе clsChair. В листинге 1.4
показана подпрограмма события IObjectConstruct_Construct.
Листинг 1.4.
(html, txt)
Значение свойства ConstructString устанавливается в окне свойств службы компонентов. Для clsClass строка подключения задана в текстовом поле Constructor String (Строка конструктора) вкладки Activation (Активация) окна свойств компонента ConfigSeat.clsClass (см. рис. 1.18). При использовании данного механизма хранения данных о состоянии инициализации класс clsChair настраивается при помощи обычных служб Windows Server, с которыми знаком любой инженер, обслуживающий такой сервер.
Примечание. Технология доступа к данным Windows, использующая технологию ODBC или OLE-DB, позволяет автоматически сохранять подключения к базе данных.Экземпляр класса подключения ADO, хранящийся в m_Connection, является локальным по отношению к классу clsChair (см. рис. 1.4). Это означает, что подключение открыто, пока существует экземпляр класса clsChair. При уничтожении экземпляра класса clsChair экземпляр подключения ADO уничтожается, однако провайдер ODBC или OLE-DB сохраняет экземпляр подключения для следующего запроса. Не нужно кэшировать объекты подключения или создавать ситуации, требующие кэширования, поскольку Windows и так выполняет эту функцию.

Рис. 1.18. Вкладка Activation (Активация) окна свойств ConfigSeat.clsClass
'~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ' ***** locals to class ***** '~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ' holds the color of the chair Private m_scolor As String
'Chair ID for class instance Private m_sID As String
'holds the ADO Connection to the data 'source that the object interacts with Private m_Connection As ADODB.Connection
Private m_sErrorMessage As String
Private Sub IObjectConstruct_Construct(ByVal pCtorObj As Object)
On Error GoTo Sub_Error_Handler Const ERROR_MESSAGE_INFO = "IObjectConstruct_Construct"
Dim sConnection As String
sConnection = pCtorObj.ConstructString
'make certain there is something If Len(sConnection) < 1 Then sConnection = DEFAULT_CONSTRUCTION_STRING End If
'establish connection to database server If m_Connection Is Nothing Then Set m_Connection = CreateObject("ADODB.Connection") End If
m_Connection.Open sConnection 'DEFAULT_CONSTRUCTION_STRING 'establish connection to database server Set m_Connection = CreateObject("ADODB.Connection") m_Connection.Open sConnection '"DSN=ASPExample"
'~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ sub_Exit_Done: Exit Sub
Sub_Error_Handler: 'record the error in class instance and rethrow 'for consuming software to learn of issue ProcessErr ERROR_MESSAGE_INFO & _ " Failure obtaining database connection information." & _ " Class will not connect to database" End Sub
Листинг 1.4.
Значение свойства ConstructString устанавливается в окне свойств службы компонентов. Для clsClass строка подключения задана в текстовом поле Constructor String (Строка конструктора) вкладки Activation (Активация) окна свойств компонента ConfigSeat.clsClass (см. рис. 1.18). При использовании данного механизма хранения данных о состоянии инициализации класс clsChair настраивается при помощи обычных служб Windows Server, с которыми знаком любой инженер, обслуживающий такой сервер.
Примечание. Технология доступа к данным Windows, использующая технологию ODBC или OLE-DB, позволяет автоматически сохранять подключения к базе данных.Экземпляр класса подключения ADO, хранящийся в m_Connection, является локальным по отношению к классу clsChair (см. рис. 1.4). Это означает, что подключение открыто, пока существует экземпляр класса clsChair. При уничтожении экземпляра класса clsChair экземпляр подключения ADO уничтожается, однако провайдер ODBC или OLE-DB сохраняет экземпляр подключения для следующего запроса. Не нужно кэшировать объекты подключения или создавать ситуации, требующие кэширования, поскольку Windows и так выполняет эту функцию.

Рис. 1.18. Вкладка Activation (Активация) окна свойств ConfigSeat.clsClass
Браузер объектов
Свойством называется специальная пара функций, предназначенных для эмуляции одного атрибута класса при использовании класса другой программой. Одна из функций предназначена для считывания значения, а другая – для записи значения. Нажмите на клавишу F2 для открытия специального окна просмотра Object Browser (Браузер объектов) – это интерфейс ко всем программным элементам проекта, открытого в VB IDE. На рисунке 1.6 в левом верхнем поле со списком выбрана библиотека ConfigSeat, а в списке Classes (Классы) в левой части окна содержится класс clsChair.
Рис. 1.6. Браузер объектов отображает класс clsChair и свойство сolor
Выберите класс clsChair, чтобы отобразить добавленное свойство color в правой области. Выделите свойство color, и в нижней части окна в области отчета появится детальное описание этого свойства с указанием типа, класса и библиотеки, которым оно принадлежит.
Свойство color в его текущем состоянии является практически бесполезным, так как для его значений еще не определены переменные. Без этих переменных установка значения свойства не позволит ни сохранить значение, ни получить его. Свойство используется для изменения значения в классе, которое находится в памяти при работе класса, поэтому нужно объявить локальную переменную с областью действия, охватывающей весь класс.
Значение color представляет собой строку, описывающую цвет стула, поэтому в верхней части кода класса объявим частную (private) строковую переменную с именем m_scolor. Ключевое слово private означает, что переменная недоступна программе за пределами класса. Область действия private целесообразно использовать при контроле доступа потребителей к членам класса, свойствам, подпрограммам и функциям. При работе возможна ситуация, когда потребуется изменить другие значения класса или проверить цвет при его установке. Если локальная переменная m_scolor будет общей, то потребитель класса сможет изменить ее значение, не поставив в известность класс.
Рекомендуется всегда использовать свойства для разрешения установки или считывания атрибута в классе.
Данный подход несколько затрудняет программирование и повышает уровень сложности программного решения, однако в будущем будет проще вносить изменения в класс. Если правила работы класса поменяются, то обновление объекта COM гораздо легче реализовать под общим интерфейсом COM, поскольку код, лежащий в основе функций свойства, используется для корректировки атрибута класса без изменения общего интерфейса класса. Изменение интерфейса класса потребует изменения потребителей класса, поэтому сложности из-за отсутствия абстракции между внутренними членами класса и его внешним интерфейсом, окажутся более серьезными по сравнению с первоначальным усложнением проекта.
В листинге 1.1 приведен код, реализующий класс clsChair.
Листинг 1.1. clsChair With Support to Read and Write the Color to the Instance Option Explicit (html, txt)
Вверху каждого файла кода в VB рекомендуется размещать выражение Option Explicit. Оно проверяет все необъявленные переменные, используемые в коде, при компиляции. При обнаружении таких переменных VB прерывает компиляцию и генерирует сообщение об ошибке. Данное выражение позволяет принудительно объявлять переменные, что полезно для выявления опечаток в именах переменных. Можно провести долгие часы, пытаясь понять, почему переменная не содержит нужного значения, и в результате обнаружить, что эта переменная просто неправильно указана в строке кода. Выявить такие ошибки трудно, поэтому используйте команду Option Explicit. VB настраивается на автоматическое добавление данного выражения в код каждого файла с помощью команды Tools\Options (Сервис\Параметры). Откройте вкладку Editor (Редактор) и отметьте опцию Require Variable Declaration (Требовать объявление переменных).
Добавление нового компонента в приложение COM+ в службы компонентов
Цель создания приложения COM+ – дать возможность службам компонентов обслуживать экземпляры классов в ConfigSeat.dll. Следующим шагом по установке ConfigSeat.dll на несущем сервере является добавление ConfigSeat.dll в только что созданное приложение COM+ New ConfigSeatWeb.В консоли управления Component Services (Службы компонентов) щелкните правой кнопкой мыши на папке Component (Компонент) под пунктом приложения COM+ New ConfigSeatWeb и выберите команду New\Component (Создать\Компонент) (см. рис. 1.15).

увеличить изображение
Рис. 1.15. Запуск мастера установки компонентов COM+
В окне Install New Components (Установка новых компонентов) приведен список компонентов, добавляемых в новое приложение COM+ (см. рис. 1.16 ).

Рис. 1.16. Окно Install New Component (Установка нового компонента) мастера компонентов COM+ с результатом загрузки библиотеки ConfigSeat.dll.
Данное окно предназначено для открытия библиотек COM DLL, загрузки их в приложение COM+ и отображения выбранных элементов. Нажмите на кнопку Add (Добавить) для открытия диалогового окна выбора файла (см. шаг 4). Выбор других библиотек COM DLL добавит их в списки файлов и компонентов, отображаемые в этом окне. Нажмите на кнопку Next (Далее).
Добавление нового приложения COM+ в службы компонентов
Ниже приведены шаги, с помощью которых новое приложение добавляется в службы компонентов.Примечание. С помощью консоли MMC cлужб компонентов можно управлять службой компонентов на удаленном узле, если у вас есть имя пользователя и пароль администратора, действительные на удаленном узле. Загрузка компонента на удаленный узел требует расположения файла компонента на этом узле. В консоли cлужб компонентов нельзя переместить файл компонента на удаленный узел.
В первом окне мастера нажмите на кнопку Next (Далее).

увеличить изображение
Рис. 1.9. Добавление нового приложения в консоль управления Components Services (Службы компонентов).
В окне Install Or Create A New Application (Установка или создание нового приложения) (см. рис. 1.10) нажмите на кнопку Create An Empty Application (Создать пустое приложение) для перехода к следующему окну.

Рис. 1.10. Окно Install Or Create A New Application (Установка или создание нового приложения) мастера установки приложения COM+
В окне Create Empty Application (Создать пустое приложение) (см. рис. 1.11) введите имя приложения COM+; в нашем случае – New ConfigSeatWeb. Имя приложения COM+ не играет особой роли с точки зрения программирования, оно определяет приложение COM+ в консоли управления службами компонентов. Библиотека DLL ConfigSeat является новым компонентом, поэтому выберите значение по умолчанию Server Application (Приложение сервера) в качестве типа активации. Параметр Activation Type (Тип активации) сильно влияет на производительность и надежность приложения COM+.
Для получения более подробной информации об этом параметре обратитесь к разделу "Общие сведения об архитектуре Windows и приложениях служб компонентов". Для продолжения работы нажмите на кнопку Next (Далее).

Рис. 1.11. Окно Create Empty Application (Создание пустого приложения) мастера установки приложения COM+
В окне Set Application Identity (Установка принадлежности приложения) (см. рис. 1.12) параметром по умолчанию является Interactive User (Интерактивный пользователь). Здесь можно указать одну из встроенных учетных записей: Local Service (Локальная служба) или Network Service (Сетевая служба) – либо вручную присвоить учетную запись для выполнения приложения COM+. Параметр Interactive User (Интерактивный пользователь) подразумевает выполнение приложения COM+ под учетной записью текущего пользователя, находящегося в системе.

Рис. 1.12. Окно Set Application Identity (Установка принадлежности приложения) мастера установки приложения COM+
Не используйте этот параметр при работе с несущими компонентами приложения COM+, так как приложение COM+ не будет запускаться после выхода пользователя из системы узла.
Учетная запись Network Service (Сетевая служба) является учетной записью пользователя Windows по умолчанию для рабочих процессов в IIS. Учетная запись Local Service (Локальная служба) налагает большие ограничения, нежели учетная запись Network Service (Сетевая служба). Обе учетные записи являются ограничительными и, следовательно, достаточно защищенными для выполнения в них приложений. В рассматриваемом примере для выполнения приложения используется учетная запись Windows с именем webuser, которая создана для работы служб, связанных с интернетом. Учетная запись webuser принадлежит группе users. После ввода и подтверждения пароля webuser нажмите на кнопку Next (Далее).
Интеграция XML и XSL
Класс clsChair поддерживает обобщение логики представления. Функция GetChairState создает упорядоченную версию объекта "стул" потребителю, осуществляющему построение страницы. Как правило, веб-приложения COM используют ASP-страницу для анализа представления HTML, реализации классов и упрощения прорисовки страницы посредством связывания XML-объектов с документами XML, необходимыми для построения страницы. В ситуации COM – ASP – XSL (или XSLT) можно создать многозвенное приложение, обобщающее типы логики и технологии, приведенные в таблице 1.1.| Логика представления | Лист XSL или XSLT |
| Бизнес-логика | VB COM и ASP. |
| Логика доступа к данным | ADO |
| Логика данных | SQL Server |
Страница ASP является уникальной частью программного решения, поскольку объединяет бизнес-логику и логику представления. В программном решении, представленном выше, ASP не была чистым обобщением бизнес-звена или звена представления, поскольку содержала аспекты каждого из них. В листинге 1.14 приведен исходный код страницы-диспетчера ASP, использовавшейся с clsChair. XMLCOMChair.asp не содержит кода HTML, вся страница отображается на листе XSL. Независимо от способа отображения данных из clsChair в браузере, ASP не требует внесения изменений. ASP должна иметь сведения об интерфейсе класса clsChair, поэтому в код включена бизнес-логика. Если в класс clsChair добавляются новые функции или свойства, то нужно отредактировать код ASP. ASP легко параметризуется в соответствии с настраиваемой системой запуска классов, полностью абстрагируясь от бизнес-логики и логики представления.
Листинг 1.14. Source Code for XMLCOMChair.asp object dispatcher (html, txt)
После выполнения экземпляром класса clsChair своей бизнес-логики состояние clsClass преобразуется в XML и используется для построения страницы HTML. Имя листа XSL – formatChair.xsl – хранится в коде ASP, но его можно получить другим способом, например, с помощью аргументов HTTP в представлениях форм или ссылках.
Подпрограмма Drawpage при помощи строкового аргумента, содержащего XML, прорисовывает конечную веб-страницу. Лист XSL определяет способ построения веб-страницы и отображение значений в XML. В XSL можно расположить и другие данные, например, сценарии JavaScript, предназначенные для выполнения в браузере. В листинге 1.15 приведен код листа XSL formatChair.xsl.
Листинг 1.15. Source code for formatChair.xsl (html, txt)
При XSL-программировании следует иметь в виду несколько важных моментов. Любой файл XSL должен быть правильно сформирован, т.е. соответствовать стандартам XML, принятым Консорциумом WWW (W3C). Ошибки в формировании файлов, как правило, вызываются следующими проблемами в коде XML.
Редакторы XML позволяют обнаружить больше ошибок при формировании XML. Пользуйтесь редактором XML для упрощения диагностики ошибок в программном решении, использующем XML, или для разработки программного обеспечения, реализующего построение XML. При неправильном формировании документа XML никакая конструкция, требующая этот документ, работать не будет. Существующие на сегодняшний день анализаторы XML не дают подробной информации о причине ошибки, поэтому поиск проблемы может оказаться затруднительным.
Когда программное решение целиком отгружено на сервер, и браузер запрашивает XMLCOMChair.asp, то отображаемая страница должна иметь следующий вид (см. рис. 1.21).

Рис. 1.21. XMLCOMChair.asp использует clsChair и formatChair.xsl для прорисовки веб-страницы
| ID | Color |
|---|---|
Please never forget, all HTML must be well formed also. XSL is also case sensitive. ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
command
Листинг 1.15. Source code for formatChair.xsl
При XSL-программировании следует иметь в виду несколько важных моментов. Любой файл XSL должен быть правильно сформирован, т.е. соответствовать стандартам XML, принятым Консорциумом WWW (W3C). Ошибки в формировании файлов, как правило, вызываются следующими проблемами в коде XML.
Редакторы XML позволяют обнаружить больше ошибок при формировании XML. Пользуйтесь редактором XML для упрощения диагностики ошибок в программном решении, использующем XML, или для разработки программного обеспечения, реализующего построение XML. При неправильном формировании документа XML никакая конструкция, требующая этот документ, работать не будет. Существующие на сегодняшний день анализаторы XML не дают подробной информации о причине ошибки, поэтому поиск проблемы может оказаться затруднительным.
Когда программное решение целиком отгружено на сервер, и браузер запрашивает XMLCOMChair.asp, то отображаемая страница должна иметь следующий вид (см. рис. 1.21).

Рис. 1.21. XMLCOMChair.asp использует clsChair и formatChair.xsl для прорисовки веб-страницы
dll на сервер ее необходимо
После копирования библиотеки ConfigSeat. dll на сервер ее необходимо зарегистрировать или загрузить в службы компонентов как приложение COM+. Для регистрации компонента компания Microsoft разработала утилиту командной строки regsvr32.exe. Для работы с ней выполните следующие действия.Для удаления библиотеки DLL COM или замены ее другой библиотекой следует аннулировать регистрацию библиотеки DLL и удалить соответствующий файл. При аннулировании регистрации из реестра удаляется запись CLSID для данной библиотеки, чем достигается "чистота" реестра и сокращается количество записей. Выполните те же самые шаги, с помощью которых проводилась регистрация, но используйте в команде ключ /u. Например, для аннулирования регистрации файла C:\bin\ConfigSeat.dll команда примет вид regsvr32 /u C:\bin\ConfigSeat.dll. Для просмотра ключей команды и информации о них выполните ее без каких-либо параметров: regsvr32.
При работе с regsvr32 не возникает каких-либо проблем. Это идеальное программное решение, не требующее управления и дополнительной информации о COM-объекте. Регистрация COM-объектов с помощью regsvr32
прекрасно подходит для приложения рабочего стола.
Использование служб компонентов для ролевого доступа
Службы компонентов разрешают ролевой доступ к любому компоненту, загруженному в приложение COM+. Учетные записи пользователей Windows приписываются к роли, и запросы компонента выполняются с помощью аутентификационных данных этих учетных записей. Если эти роли связаны с запрашиваемой частью компонента, то программа-потребитель будет функционировать должным образом; в противном случае она не сможет осуществить доступ к компоненту. Роли связываются с компонентом, загруженным в приложение COM+, на следующих уровнях:Следует включать ролевой доступ, начиная с верхнего уровня и далее вниз, до нужного уровня контроля доступа. В качестве метода компонента можно определить низшую дискретную функциональность, реализующую контроль доступа. Для включения ролевого доступа выполните следующие шаги.
Чтобы включить проверку доступа уровня компонента для приложения COM+, выполните следующие шаги.
Для включения проверки доступа для компонента нужно включить проверку доступа для приложения COM+ и после этого выполнить следующие шаги.
Для присвоения роли компоненту в целом отметьте роль в списке Roles Explicitly Set For Selected Item(s) (Роли, установленные для выделенных элементов). Все методы компонента унаследуют данную роль.
Для присвоения роли определенным методам внутри компонента отметьте опцию Enforce Component-Level Access Checks (Обязательная проверка доступа на уровне компонента), что позволит в дальнейшем присваивать роли методам компонента.
Для компонента ConfigSeat.clsChair, добавленного в приложение COM+ New ConfigSeatWeb, ролевой доступ не требуется, поэтому обязательные проверки доступа уровня компонента не включены. Приложение COM+ New ConfigSeatWeb, тем не менее, настроено на обязательную проверку доступа, поэтому проверки доступа компонентного уровня включены. Если система IIS функционировала под учетной записью по умолчанию, созданной Windows (например, IUSR_имя_компьютера), то ASP-программа, создающая объект ConfigSeat.clsChair, вызовет ошибку, поскольку гостевая учетная запись интернета не имеет доступа к компоненту ConfigSeat.clsChair. После смены ее на другую учетную запись с доступом к указанному компоненту код ASP будет функционировать должным образом. Для использования кодом ASP компонента ConfigSeat.clsChair веб-сайт или виртуальный каталог в IIS настроен на работу с использованием аутентификационных данных учетной записи webuser.
Для настройки доступа выполните следующие шаги.
Теперь страницы ASP будут выполняться под учетной записью webuser. При создании страницами ASP компонента ConfigSeat.clsChair аутентификационные данные учетной записи webuser представляются для запроса в службы компонентов. Службы компонентов проверяют разрешения учетной записи webuser на создание и использование компонента, и ASP реализует функции в компоненте ConfigSeat.clsChair.
Использование служб компонентов
Установка объекта COM в службах компонентов более предпочтительна для веб-приложений по сравнению с использованием regsvr32, поскольку компоненты веб-приложении зачастую требуют последующего управления и обновления компонентов. Любое программное обеспечение, загруженное в службы компонентов, называется компонентом. Службы компонентов имеют больше возможностей по управлению компонентами, например:Для загрузки объекта COM в службы компонентов сначала нужно создать приложение COM+. Приложение COM+ содержит один или более объектов или компонентов COM. Приложение COM+ в службах компонентов интерпретируется как идеальный (с точки зрения потребителя) развертываемый модуль. Приложение COM+ может использоваться другим процессом, или процесс, под которым выполняется приложение COM+, может быть предоставлен службам компонентов. Запуск (или остановка) приложения COM+ включает (или запрещает) использование всех его компонентов. Если наряду с надежными компонентами загружены ненадежные, то надежные компоненты нужно переместить в другое приложение COM+, которое не требует такого количества административных изменений, как приложение COM+ с проблемными библиотеками DLL. Такая стратегия минимизирует время простоя компонентов приложения, которое не будет "списано со счета" из-за ошибки в одном-единственном компоненте. Появляется возможность более четкого управления установкой компонента, изолированного от остальных надежных компонентов, пока его надежность не будет доказана.
Использование VB в COM
До сих пор мы показывали построение простейшего веб-приложения COM, включая все этапы процесс разработки. В реальном COM-объекте должен присутствовать набор классов, отражающий объекты, выявленные в процессе сбора требований. Среди возможностей веб-приложений COM следует отметить хранение данных, связанных с выявленными объектами, чтение данных об этих объектах, упорядочивание данных с помощью XML и их форматирование для отображения в браузере. В данной лекции мы пропустим шаги, связанные со сбором требований. В лекции 6 показаны действия, входящие в цикл разработки программного обеспечения.Объектно-ориентированное (ОО) проектирование и анализ представляют собой большую редкость в современном сообществе разработчиков программного обеспечения. Веб-программы не менее сложны, чем другое комплексное программное обеспечение, имеют неопределенную структуру при разработке и дизайне, поэтому не следует игнорировать зарекомендовавшие себя правила и подходы к разработке.
В организациях проектирование и анализ зачастую выполняются после создания продукта, и в этом случае каждое усовершенствование требует его перестройки. В любом проекте время, отведенное для анализа и проектирования, влияет на завершение процесса программирования в намеченные сроки, позволяет в будущем без особых проблем усовершенствовать программу и усиливает командный дух специалистов, занятых разработкой.
Существует проблема, связанная с ОО-анализом и проектированием в VB6. VB6 не позволяет создать действительно объектно-ориентированное программное решение. Эта среда программирования не поддерживает наследование реализации. Отсутствие реального полиморфизма и других возможностей ограничивает его эффективность при разработке приложений, обеспечивающих долговечность, особенно для масштабируемого программного решения. Объекты COM можно построить на других ОО-языках, например, на C++ и Java.
VB6 поддерживает другие возможности истинно полиморфного языка, но наследование классов – очень важная функция – в нем отсутствует.
Не следует воспринимать наследование в VB6 за истинное наследование. Документация Microsoft описывает VB6 как объектно-ориентированный язык, обеспечивающий наследование классов с помощью команды implements. Однако команда implements обеспечивает только наследование интерфейса. С практической точки зрения это означает, что IDE в VB6 заново конструирует интерфейс суперкласса в дочернем классе и заставляет программиста поддерживать весь интерфейс суперкласса в подчиненном классе. Программист создает весь объем кода наследуемых функций в дочернем классе.
VB6 позволяет быстро разработать надежные компоненты, обеспечивающие функциональность, связанную с экземпляром класса. Классы используют другие классы, что весьма полезно. Вероятно, лучшей демонстрацией возможностей VB6 является проект, в котором на этапе сбора требований выявлено немного объектов, или проект с небольшим потенциалом для масштабируемости в будущем и с коротким циклом разработки. VB6 является альтернативой истинно полиморфного языка типа C++, требующего от программиста высокого уровня знаний, и технологии сценариев типа VBScript ASP.
Модульный тест библиотеки COM DLL
Для тестирования библиотеки ConfigSeat.dll можно создать несложный код ASP, реализующий экземпляр класса clsChair для вывода значения color в браузер и изменения этого значения. Файл ASP DescribeChair.asp (см. листинг 1.2) можно расположить в веб-приложении на сервере с библиотекой ConfigSeat.dll. Файл ASP можно расположить на веб-сайте по умолчанию, созданном при установке IIS. Если сервер не настроен на выполнение exe-файлов, то проведите соответствующую настройку. Для получения инструкций по реализации работы ASP в IIS6 обратитесь к лекции 12 курса "Администрирование web-серверов в IIS".Листинг 1.2. ASP DescribeChair.asp used to test the COM component ConfigSeat.DLL (html, txt)
Для демонстрации возможностей служб компонентов DescribeChair.asp следует запустить много раз. Нагрузка на веб-сервер, созданная запросами на файл ASP, не обеспечивает достаточный спрос на компонент COM или сервер, на котором он расположен, поэтому службы компонентов не зарегистрируют потребность в ресурсах. Microsoft предлагает две утилиты, предназначенные для проведения проверки нагрузкой.
WAS – бесплатная программа; Microsoft Application Center Test входит в пакет Visual Studio .NET Enterprise Edition.
Для создания нехватки ресурсов в ASP и просмотра реакции на это условие в Microsoft Application Center Test был создан простой сценарий, моделирующий одновременную работу ста пользователей в течение 5 минут. Такая нагрузка достаточно велика, и службы компонентов испытывали большую нагрузку при обслуживании экземпляра clsChair. В каждый момент времени создавалось от нуля до пяти экземпляров clsChair, обеспечивавших 175 запросов на страницы в секунду. На рисунке 1.17
показана консоль управления службами компонентов, отображающая состояние класса clsChair при тестировании нагрузкой.

увеличить изображение
Рис. 1.17. Консоль управления службами компонентов, отражающая использование класса clsChair
Настройка проекта ActiveX DLL
После выбора типа проекта будет создан новый проект с именем Project1 и новый класс Class1. Если сразу скомпилировать проект, то конечный файл будет называться по умолчанию Project1.dll, а идентификатор класса (CLSID), используемый для идентификации класса в команде ASP Server.CreateObject – Project1.Class1. Имена класса и проекта должны быть информативными, а не шаблонными именами по умолчанию. Классу следует присвоить имя применительно к сути создаваемого проекта, а проекту – имя, определяющее файл хранилища или исполнения, внутри которого будет находиться класс.Примечание. Все COM-объекты, созданные с помощью проекта Active X DLL в VB6, имеют расширение .dll.
Пусть в нашем примере веб-приложение является частью интернет-проекта по выбору параметров мебели с именем ConfigSeat.
Объект "стул" определен в процессе сбора требований, а создаваемый класс предназначен для представления этого объекта и является частью бизнес-логики программного приложения. Данный класс логично назвать clsChair. Префикс cls определяет объект как класс. Элемент Auto List Members в функции Visual Basic IntelliSense отображает имена частей проекта и не различает классы и другие типы файлов, например, модули. Использование префикса cls облегчает идентификацию класса в списке Auto List Members.
Для изменения имени класса откройте окно свойств с помощью команды View\Properties Window (Вид\Окно свойств) и выберите класс в Project Explorer (Диспетчер проектов). Исправьте имя Class1 в области Name (Имя) на clsChair (см. рис. 1.3). (Остальные параметры в окне свойств не меняйте, поскольку для этого требуются глубокие знания процесса разработки VB ActiveX. В данной лекции этот вопрос не рассматривается.)
Вы можете также изменить имя проекта, щелкнув правой кнопкой мыши на имени проекта в Project Explorer (Диспетчер проектов).

Рис. 1.3. Окно свойств класса
В диалоговом окне свойств проекта во вкладке General (Общие) имеется текстовое поле Project Name (Имя проекта), в котором отображается имя по умолчанию Project1.
В нашем примере назовем проект ConfigSeat. Удалите в текстовом поле имя Project1 и введите ConfigSeat (см. рис. 1.4).
Многие программисты не знают о существовании автоматической нумерации версий в VB6. Номера версий помогают определять последнюю версию разрабатываемой библиотеки DLL с помощью уникальных идентификаторов. При каждой компиляции программного кода номер версии увеличивается. Как правило, объект COM устанавливается на узел несколько раз. Потребители программного обеспечения должны использовать только одну версию (последнюю), и номера версий позволяют работать именно с этой версией. При отсутствии номеров версий для определения последней версии пришлось бы использовать дату создания файла. В некоторых ситуациях (особенно при совместной работе над проектом нескольких программистов) определение номера версии по дате не работает. Для включения автоматического присвоения номеров новым версиям проекта откройте вкладку Make (Создание) в диалоговом окне свойств проекта и отметьте опцию Auto Increment (Автоматическая нумерация). Если вы не сделаете это, ошибки в программе не возникнет. Опция Auto Increment (Автоматическая нумерация) по умолчанию не включена, но мы настоятельно рекомендуем включать ее в каждом проекте.

Рис. 1.4. Диалоговое окно свойств проекта с новым именем ConfigSeat
Настройка совместимости с двоичными файлами в VB
Если при перекомпиляции ConfigSeat.dll не скомпилирована тестовая структура, то может возникнуть ошибка при создании экземпляра класса. Это возможно для любого COM-объекта, если другая программа использует COM-объект и содержит ссылки на него. В VB проект ActiveX DLL настраивается на совместимость с проектом по умолчанию во вкладке Component (Компонент) окна свойств проекта. При перекомпиляции рассматриваемого проекта ActiveX DLL не будет установлена совместимость с двоичными файлами, поэтому при выполнении других программ со скомпилированными ссылками на библиотеку ActiveX DLL возникнут ошибки.Для иллюстрации вышесказанного рассмотрим следующую ситуацию: ConfigSeat.dll скомпилирована в 9:00 утра. В полдень скомпилирована тестовая структура с именем testconfigseat.exe. Тестовая структура testconfigseat.exe содержит определенные ссылки на ConfigSeat.dll, и в ее коде класс озаглавлен строго определенным образом. В 18:00 проект ConfigSeat.dll перекомпилирован и установлена совместимость с проектом. При выполнении в 18:08 файл testconfigseat.exe вызвал ошибку, поскольку не смог найти библиотеку ConfigSeat.dll из-за изменения CLSID. При каждой компиляции ConfigSeat без указания совместимости с двоичными файлами генерируется новый CLSID. После настройки компонента на совместимость с двоичными файлами (см. рис. 1.20) VB использует один и тот же CLSID при каждой компиляции DLL, поэтому любое зависимое от библиотеки программное обеспечение работает исправно.
Приложение, использующее библиотеку ActiveX DLL, ожидает интерфейс для данного CLSID. Изменение интерфейса класса иначе, чем добавлением новой функции или свойства, вызовет ошибки в приложениях-потребителях, работа которых основывается на классе.

Рис. 1.20. Во вкладке Component (Компонент) окна свойств проекта установлена совместимость с двоичными файлами
Вы можете добавить новые функции, однако нельзя изменить или удалить имеющиеся параметры. Для имени библиотеки и класса идентификатор CLSID остается неизменным, что достигается компиляцией, совместимой с двоичными файлами. Преимуществом совместимости с проектами является то, что программист может ссылаться на проект ActiveX DLL и легко изменять интерфейсы внутренних классов. Поскольку при программировании интерфейс меняется, совместимость с проектами позволит VB разрешить изменения, не предупреждая о нарушении совместимости при удалении или редактировании общей функции.
Обработка ошибок
Взаимодействие с базой данных выводит нас на новый уровень сложности приложения, для которого требуется большая надежность в критических ситуациях. Корректная поддержка ошибок является необходимым условием реализации любого кода; она должна обрабатывать ситуации, которые вызывают возникновение ошибки в подпрограмме, например, при взаимодействии с пользователем или при соединении с разнородными системами.В Visual Basic имеется система обработки ошибок, легкая в использовании и управлении. Отсутствие обработки ошибок распространяется и на программу-потребителя. В этом случае пользователь видит малоинформативное сообщение, и программа прерывает свою работу. В веб-приложении, где COM-объект используется страницей ASP, конечному пользователю отображается сообщение об ошибке, если IIS настроен на показ таких сообщений.
Каждая исключительная ситуация, имеющая место в классе clsChair, фиксируется в журнале событий и сохраняется в локальной переменной свойства ChairError. Код написан таким образом, что при получении информации об ошибке приостанавливается его работа. Обработка ошибок в классе clsChair реализована с использованием той же базовой технологии во всех функциях и подпрограммах. Обработчик ошибок устанавливается на входе в функцию или подпрограмму для перехода к определенной строке. Указываются две строки, определяющие стратегию выхода при обработке ошибок: sub_Exit_Done и sub_Error_Handler. Строка sub_Error_Handler представляет стратегию, согласно которой действия осуществляются при возникновении исключительных условий, указанных в выражении On Error. Код, следующий за строкой sub_Exit_Done, представляет собой обычную стратегию выхода функции или подпрограммы, если при работе программы не возникают исключительные ситуации. В листинге 1.5 приведена типовая структура системы обработки ошибок, примененная в классе clsClass.
Листинг 1.5.
(html, txt)
Подпрограмма ProcessErr, вызываемая в рамках стратегии обработки исключительных условий, обрабатывает ошибки VB или другие неверные условия. ProcessErr выполняет следующие действия:
Журнала не будет заполняться до тех пор, пока компонент не будет скомпилирован, по причине ограничения VB и мер безопасности Windows. При выполнении компонента в VB IDE журналы событий не ведутся.
В листинге 1.6 приведен код подпрограммы ProcessErr.
Листинг 1.6. ProcessErr Subroutine – Error Logger and Formatting (html, txt)
ProcessErr записывает время и добавляет его к описанию ошибки. Свойства класса VB Err конкатенируются в строку, которая станет частью сообщения об ошибке, фиксируемого и сохраняемого в локальной переменной ошибки.
'~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ sub_Exit_Done: 'return success value
On Error Resume Next 'destroy objects Exit Function
Sub_Error_Handler: ProcessErr " message about the failure in terms of function"
Листинг 1.5.
Подпрограмма ProcessErr, вызываемая в рамках стратегии обработки исключительных условий, обрабатывает ошибки VB или другие неверные условия. ProcessErr выполняет следующие действия:
Журнала не будет заполняться до тех пор, пока компонент не будет скомпилирован, по причине ограничения VB и мер безопасности Windows. При выполнении компонента в VB IDE журналы событий не ведутся.
В листинге 1.6 приведен код подпрограммы ProcessErr.
'~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 'ProcessErr 'formats error and stores it in error local 'then write to event log. Event logging 'will not function in IDE - only in compiled. ' 'in: vsMessage - usually denoting function 'out: nothing '~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ Private Sub ProcessErr(ByVal vsMessage As String)
Const ERROR_SEPARATOR = " -- " Const NOW_TIME_FORMAT = "yyyy mmm d hh:mm:ss" Const A_SPACE = " " Const ERROR_NUM = " Error #" Const ERROR_BY = " was generated by "
Dim sDateTime As String
'get a time data stamp sDateTime = CStr(Format(Now, NOW_TIME_FORMAT)) & _ ERROR_SEPARATOR
'construct the error entry vsMessage = sDateTime & vsMessage
'add err object data to the error entry m_sErrorMessage = vsMessage & ERROR_NUM & Err.Number _ & ERROR_BY & Err.Source & A_SPACE & Err.Description & vbCrLf
'write to event log App.LogEvent m_sErrorMessage, vbLogEventTypeError
End Sub
Листинг 1.6. ProcessErr Subroutine – Error Logger and Formatting
ProcessErr записывает время и добавляет его к описанию ошибки. Свойства класса VB Err конкатенируются в строку, которая станет частью сообщения об ошибке, фиксируемого и сохраняемого в локальной переменной ошибки.
Общие сведения об архитектуре Windows и приложениях служб компонентов
Для понимания различий между серверным приложением и приложением библиотеки в службах компонентов необходимо знать некоторые термины и механизмы архитектуры Windows. Процессом называется исполняемая программа, которая выполняется в данный момент. Операционная система Windows предоставляет процессорное время для каждого порожденного процесса. Нитью называется работа, выполняемая внутри процесса. Процесс может поддерживать одновременно несколько нитей. Если нити в процессе отсутствуют, то процесс считается выполненным, и Windows не выделяет ему процессорное время.Чем больше процессов выполняется, тем больше ресурсов используется компьютером для обеспечения их работы. Запуск процесса изначально требует значительного количества ресурсов сервера. Остановка одного процесса не влияет на другие процессы, если последние не нуждаются в нем. Остановка процессов является лояльным действием, не представляющим риск для стабильности системы, поэтому распределение большего количества работы между процессами требует большего объема системных ресурсов, но обеспечивает более высокий уровень надежности.
Стремясь к сокращению системных ресурсов, связанных с запуском и работой процессов, программисты разрабатывают программное обеспечение для загрузки в память под существующим процессом вместо создания нового процесса. Сравнение веб-приложений Common Gateway Interface (CGI) и веб-приложений ASP показывает различие, о котором идет речь. Если на веб-странице, требующей работы приложения CGI, наблюдается 10 посещений в минуту, то независимо от сложности этой работы серверу придется запускать исполняемый файл CGI 10 раз в минуту, т.е. 600 раз в час.
Если страница ASP выполняет те же задачи, что и исполняемый файл CGI, то через один и тот же интервал времени запускаются нулевые процессы. На самом деле запускается лишь один процесс, и это происходит при старте сервера; этот процесс – IIS. Расширение ISAPI ASP.DLL работает в пространстве процесса IIS. Раньше службы IIS останавливались без видимых причин после продолжительного периода времени.
Подобные ошибки возникали из-за повреждения процесса IIS и его дестабилизации исключением, утечкой памяти или невыпущенными указателями. Причиной этому была загрузка библиотеки DLL с дефектами в пространство процесса IIS. Эта унаследованная особенность (или ошибка) в архитектуре Windows привела к тому, что IIS воспринимается как ненадежная система в сравнении с другими, менее сложными системами, использующими CGI.
Для повышения надежности без потерь производительности (что возможно при работе программного обеспечения в собственном независимом процессе) был разработан сервер Microsoft Transaction Server (MTS) для Windows NT 4. MTS превратился в службы приложений (или COM+) на платформе Windows 2000. На каждой новой платформе у служб компонентов появлялись новые возможности. Основным достоинством служб является то, что они выступают в роли сервера DLL. Библиотеку DLL объекта COM можно загрузить в приложение COM+, и она будет выполняться в своем собственном процессе или в процессе программы-потребителя. Приложение сервера COM+ выполняется в собственном процессе, а приложение библиотеки – в процессе программы-потребителя. Если используемые библиотеки DLL надежны и не требуют частого изменения и обновления, то их следует размещать в приложении библиотеки, так как среднестатистическое программное решение использует меньше ресурсов сервера и функционирует с большей производительностью. Если библиотеки DLL созданы недавно, ненадежны или требуют частого обновления, то их следует располагать в приложении сервера. Это исключит сбои в обычной программе при возникновении ошибки в компоненте, и для обновления не потребуется полная остановка этой программы.
Построение тестовой структуры
Любое программное обеспечение необходимо тестировать, и VB IDE для этого имеется прекрасный механизм. Нажмите на кнопку Start (Пуск) в панели инструментов VB либо на клавишу F5, чтобы откомпилировать и выполнить программу.Поскольку проект ConfigSeat является библиотекой ActiveX DLL, его нельзя выполнить, т.к. он должен использоваться другой исполняемой программой. Для тестирования класса clsChair следует создать еще один проект в том экземпляре IDE, где редактируется clsChair.Это будет исполняемая программа с одной задачей – тестированием класса clsChair. Программа для тестирования другой программы называется тестовой структурой.

Рис. 1.7. Диалоговое окно проекта References (Ссылки)
Запомните. В диалоговом окне References (Ссылки) отображаются ссылки для выбранного в настоящий момент проекта. Изменение ссылок применяется только к этому проекту. Вы можете случайно выделить и другие проекты в группе проектирования, поэтому перед внесением изменений убедитесь в том, что выбрано соответствующее диалоговое окно References (Ссылки) с именем окна активного проекта в строке заголовка.
Элемент form1 можно настроить на отображение функционирования различных компонентов класса clsChair.
Используемый подход заключается в представлении всех свойств класса в виде текстовых полей, всех функций – в виде кнопок, с текстовыми полями для аргументов формы тестовой структуры соответствующего класса. Тестовую структура нужно сохранить вместе с исходным кодом тестируемого класса, так как в будущем это поможет при усовершенствовании класса или устранении ошибок.
Примечание. Рассматриваемая тестовая структура – clsChairTester – сохранена с исходным кодом данной лекцию и доступна на веб-сайте автора книги.
В классе clsChair имеется только одно свойство, поэтому тестовая структура просто установит значение свойства и покажет его пользователю. После добавления в форму нескольких текстовых полей и командной кнопки, написания кода для создания и управления классом clsChair можно протестировать компонент "стул" с помощью тестовой структуры.
На рисунке 1.8 показана тестовая структура, при работе которой цвет стула успешно изменен в нескольких тестах.

Рис. 1.8. Тестовая структура clsChair тестирует свойство color
Построение в VB6 COM-объекта с поддержкой доступа к данным
Возьмем созданный ранее объект "стул" и используем его в дальнейшем процессе разработки, т.е. усовершенствуем объект, добавив функции чтения и записи данных в базу данных, упорядочивание состояния экземпляра класса и его фиксирование в документе XML. В класс clsChair добавятся следующие функции.В класс clsChair добавятся следующие свойства.
Интерфейс по-прежнему не сложен, однако теперь он более соответствует классу в истинном объектно-ориентированном программном решении. Целесообразно добавить в интерфейс и другие функции: delete (удаление) и save (сохранение) – однако для сокращения приводимых в книге примеров рассматривать их не будем.
Имя chair предшествует именам функций в классе clsChair. Создавать интерфейс к объекту, использующий имя самого объекта, не рекомендуется, однако этого требуют ограничения данной технологии. Оpen и create являются ключевыми словами, зарезервированными в VB, поэтому их нельзя использовать в качестве имен пользовательских функций в экземпляре класса. Следует заметить, что наследование класса не содержит какой-либо логики, за исключением того, что связано с описанием самого стула или с его действиями в рассматриваемом сценарии. Отсутствует логика данных или логика представления, например, строки подключения к базе данных или HTML-вывод.
В листинге 1.3 приведен общий интерфейс объекта "стул"; он содержит объявления следующих функций, включая код реализации.
Листинг 1.3.
(html, txt)
Применение библиотеки COM DLL
Теперь, когда класс clsChair прошел модульное тестирование в тестовой структуре, он почти готов для использования в веб-приложении. Однако перед этим его нужно скомпилировать и разместить на несущем сервере. Выполните следующие действия.Откроется диалоговое окно Make Project (Создать проект), в котором нужно ввести имя файла и расположение новой библиотеки DLL. Измените имя файла или путь к файлу, если это необходимо, и нажмите на клавишу OK.
VB откомпилирует проект ConfigSeat и создаст файл .dll. Библиотека DLL автоматически зарегистрируется на узле, и ее можно будет сразу использовать. (О регистрации DLL речь пойдет в следующем подразделе.)
Расширенная тестовая структура
Новый класс clsChair можно протестировать после расширения тестовой структуры (см. рис. 1.8) для проверки созданного интерфейса. В тестовую структуру были добавлены кнопки Get XML (Получить XML), Open (Открыть) для открытия нового экземпляра объекта "стул" и Create (Создать) (см. рис. 1.19). Перед нажатием на кнопку Open (Открыть) укажите в текстовом поле аргумент стула ID.
Рис. 1.19. Расширенная тестовая структура для clsChair
Создание интерфейса класса в ActiveX DLL
Объект "стул" имеет некоторые атрибуты: цвет, высота, наличие или отсутствие колес. Эти атрибуты можно присоединить к классу в виде свойств. Ниже показано, как расширить класс clsChair добавлением свойства color.
Рис. 1.5. Диалоговое окно Add Procedure (Добавление процедуры)
Специальные символы в коде XML
В XML для описания данных используется обычный текст, поэтому возможны проблемы, связанные с расшифровкой данных из структуры XML. Возьмем, к примеру, имя сотрудника компании O'Brien. Что произойдет, если программа поместит список сотрудников, в который входит и O'Brien, в документ XML, предназначенный для отображения в браузере? Элемент XML будет выглядеть так: <имя сотрудника="O'Brien">. Если апостроф не будет закодирован как специальный символ, то в анализаторе XML при загрузке кода произойдет ошибка. При кодировании специальных символов соответствующим образом элемент XML примет вид: <имя сотрудника="O'Brien">.Многие символы требуют кодирования. Специальные символы представляются в виде числовых ссылок из набора символов ISO/IEC 10646. Некоторым символам присвоены специальные знаковые последовательности, вид которых соответствует обозначаемому символу.
| & | & |
| < | < |
| > | > |
| ' | ' |
| " | " |
Например, числовая ссылка на символ "&" имеет вид "&", можно использовать и представление "&". Числовым представлением символа "=" является "=". Для данного символа отсутствует знаковая последовательность. Для получения информации о других символах и эквивалентных им представлениях обратитесь к Приложению. Дополнительная информация по XML приведена на странице http://www.w3.org/TR/REC-xml, где можно ознакомиться с W3C-спецификацией для XML.
Структурирование данных в XML
Функция GetChairState создает документ XML, описывающий экземпляр класса clsChair. XML является простым одноэлементным документом. Элемент Chair содержит два атрибута: ID и Color. Для использования объекта XML добавьте в проект ссылку на библиотеку MSXML (см. рис. 1.7). В нашем проекте выбрана библиотека Microsoft XML v3.0, но существуют и другие версии этой библиотеки. На момент публикации книги уже вышла четвертая версия. В подпрограмме применяется конкатенация строк для построения XML и возврата строки из класса. Однако такой подход опасен, поскольку в большинстве XML-анализаторов сразу возникнет ошибка при некорректности любой части XML. Создание XML с использованием анализатора позволит правильно построить XML. В листинге 1.12 приведен исходный код функции GetChairState.Листинг 1.12. Function GetChairState (html, txt)
После изучения кода в листинге 1.12 становится ясно, почему при построении XML используется конкатенация строк. Применение DOM Document
интуитивно непонятно, и кажется, что для построения форматированной строки выполняется очень большой объем работы. Первая версия библиотеки XML MSXML.DLL была медленной и неэкономичной с точки зрения ресурсов; здравомыслящий программист реализует XML гораздо быстрее конкатенацией строк. Язык VB не достаточно эффективен для этого. Сокращение изменений, вносимых в строку, кардинально улучшает производительность. Поскольку технологии, связанные с XML, являются довольно новыми, программное обеспечение, поддерживающее эти технологии, должным образом не "устоялось". Программист должен быть в курсе новых данных от производителя и авторов статей и книг, так как данная технология постоянно модернизируется.
'~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ sub_Exit_Done: 'return object Set GetChairState = xmlChair
On Error Resume Next 'destroy objects Set xmlChair = Nothing
Exit Function
Sub_Error_Handler: ProcessErr " Failure serializing chair into XML. "
End Function
Листинг 1.12. Function GetChairState
После изучения кода в листинге 1.12 становится ясно, почему при построении XML используется конкатенация строк. Применение DOM Document
интуитивно непонятно, и кажется, что для построения форматированной строки выполняется очень большой объем работы. Первая версия библиотеки XML MSXML.DLL была медленной и неэкономичной с точки зрения ресурсов; здравомыслящий программист реализует XML гораздо быстрее конкатенацией строк. Язык VB не достаточно эффективен для этого. Сокращение изменений, вносимых в строку, кардинально улучшает производительность. Поскольку технологии, связанные с XML, являются довольно новыми, программное обеспечение, поддерживающее эти технологии, должным образом не "устоялось". Программист должен быть в курсе новых данных от производителя и авторов статей и книг, так как данная технология постоянно модернизируется.
Свойства в классах
Свойства в VB представляют собой обычные функции для упрощения доступа и присвоения значений. Программист может включить в подпрограмму свойства код, реализующий работу программы. Рекомендуется создавать функции или подпрограммы для ситуаций, в которых работа выполняется программой. Хорошим примером функции в классе clsChair, являющейся свойством "только для чтения", будет GetChairState(). GetChairState() выполняет работу по созданию кода XML, поэтому она размещена в функции, возвращающей экземпляр класса. Если класс DOMDocument30 сохранен в локальной переменной класса и инициирован после вызова функции Open() или Create(), то использование свойства с доступом "только для чтения" является лучшим способом возврата экземпляра класса DOMDocument30.Поскольку свойства ChairError и ChairID доступны только для чтения, то при попытке записи в функцию значения произойдет ошибка. Свойство color является единственным свойством, поддерживающим чтение и запись, поскольку существуют два прототипа свойства – Get и Let. Свойства ChairError и ChairID доступны только для чтения, поэтому содержат только прототип Get.
Ни в одном фрагменте кода данной лекции не показана еще одна возможность VB, которая, правда, не очень важна. Свойство может принимать и возвращать аргумент экземпляра класса. Если для принятия экземпляра класса используется прототип свойства, то используется ключевое слово Set, а не Let. Например, если класс clsChair имеет свойство записи ChairState, которое воспринимает экземпляр класса XML DOM как аргумент, то прототип выглядит следующим образом:
Public Property Set ChairState(ByVal vNewValue As DOMDocument30) End Property
отображается диалоговое окно New
После запуска Visual Basic 6 отображается диалоговое окно New Project (Новый проект) (см. рис. 1.2), в котором выбирается тип проекта. Для построения COM-объектов веб-приложения выберите ActiveX DLL и нажмите на кнопку Open (Открыть).
Рис. 1.2. Диалоговое окно нового проекта в Visual Basic 6
В VB6 можно создать проекты других типов, например, исполняемые файлы и элементы управления ActiveX. Проекты ActiveX EXE и Standard EXE обычно используются при разработке приложений. Проект исполняемого файла мы рассмотрим далее при создании тестовой программы для библиотеки DLL ActiveX. В проекте ActiveX Control мы сгенерируем элемент управления ActiveX, передаваемый браузеру или используемый в приложениях рабочего стола.
Из-за ограничений, связанных с разработкой программ в VB runtime, элементы управления ActiveX, написанные на VB, не подходят для веб-разработки, поскольку после установки программы на клиенте зачастую требуется перезагрузка компьютера для работы с новым элементом управления ActiveX.
Загрузка в COM+ с помощью строки Constructor
ConfigSeat.dll можно скопировать в среду сервера и разместить в приложении COM+, заменив предыдущую версию ConfigSeat.dll. Приложение COM+ в службах компонентов может заблокировать DLL. После отключения приложение в службах компонентов библиотека DLL освобождается для удаления. Если библиотека DLL участвует в работе веб-приложения, то веб-сервер не будет использовать класс clsChair после удаления классов в DLL из приложения COM+.Сейчас мы выполним загрузку новой версии clsClass в приложение COM+ New ConfigSeatWeb.
Листинг 1.13. DescribeChairFinal.asp used to demonstrate added interface of clsChair. (html, txt)
Запустите тест нагрузкой из утилиты Microsoft Application Center Test, и вы увидите, что работа приложения ASP – COM – база данных требует больше ресурсов, чем простое приложение ASP – COM. Предыдущая версия clsChair не предусматривает взаимодействия с базой данных, и база данных располагается на том же сервере, где расположены ASP и COM-объект clsChair. При моделировании одновременной работы 100 пользователей в течении 5 минут выяснилось, что приложение способно поддерживать среднюю нагрузку, равную 45 запросам на страницы в секунду.
На рисунке 1.17 показано окно служб компонентов, отображающее состояние предыдущего теста. В тесте для предыдущей версии clsChair заголовки Call и Call Time не регистрировали никаких значений, кроме 0. В последней версии clsChair поле In Call стабильно отображало значения от 0 до 1, а поле Call Time стало равным 15 мс. Очевидно, что производительность компонента заметно снизилась по сравнению с проведенным ранее тестом. Как видите, дополнительная функциональная нагрузка, связанная со считыванием информации из базы данных, снижает эффективность работы веб-приложения.
' create the object since this is hard work set o = Server.CreateObject("ConfigSeat.clsChair")
'demonstrate that values were changing Response.Write(" color=" & o.color & "
") Response.Write("change color to blue
") o.color = "blue" Response.Write(" color=" & o.color & "
")
if o.CreateChair() then Response.Write(" new id=" & o.ChairID & "
") else Response.Write(" possible error=" & o.ChairError & "
")
end if
set oXML = o.GetChairState()
Response.Write(" xml=" & oXML.XML & "
")
Response.Write(" open new chair
")
if not o.OpenChair("20021129095221") then Response.Write(" possible error=" & o.ChairError & "
") end if
Response.Write(" new chair color should be purple
") Response.Write(" new chair color =" & o.color & "
")
'destroy object so it can be created again set o = nothing %>