Використання сервісів COM + в. NET,. NET Framework, ASP, статті

Можливо, ви вже використали програми COM + для хостингу
компонентів, написаних на Visual Basic або C + +. COM + надає
безліч корисних сервісів, у тому числі транзакції, компоненти з
підтримкою черг, активізацію на вимогу (just-in-time
activation), захист на основі ролей, загальні (shared) властивості і т. д.
Один з найбільш привабливих аспектів застосування COM + для хостингу
компонентів – можливість зміни поведінки компонента без єдиної
рядки додаткового коду (наприклад, вказати обов'язковість підтримки
транзакцій компонентом, позначивши її як Required). Якщо для
COM +-компонента встановити перемикач Required (рис. 1) у розділі
Transaction Support (в оснащенні Component Services консолі MMC), цей
компонент щоразу буде створюватися в контексті COM +-транзакції. А
коли компонент використовує COM +-транзакції, всі транзакції бази даних
обробляє Distributed Transaction Coordinator (DTC).

Рис. 1. Приклад COM +-компонента, що вимагає транзакцій

Налаштувати параметри захисту для компонента не складніше, ніж підтримку
транзакцій. Ви можете вказувати, які компоненти або їх методи доступні
тим чи іншим користувачам; перекомпіляції коду при цьому не вимагається.
Все це робиться через оснащення COM + Services.

. NET може працювати з усіма сервісами COM +

В. NET Framework можна як і раніше використовувати всі сервіси COM +,
якщо ваші класи успадковують від
System.EnterpriseServices.ServicedComponent
. У табл. 1 перераховані
сервіси COM +, підтримувані в. NET.

Табл. 1. Доступні сервіси COM +

 

Сервіс COM + Опис
Автоматична обробка транзакцій
(Automatic Transaction Processing)
Застосовує оголошені засоби обробки
транзакцій
COM Transaction Integrator (COMTI) Інкапсулює програми CICS і IMS в
об'єктах Automation
Диспетчери компенсації ресурсів Compensating
Resource Managers (CRMs)
Застосовує до ресурсів, не підтримує
транзакції, властивості атомарности та відмовостійкості
Активізація за вимогою (Just-In-Time
Activation)
Активізує об'єкт при виклику методу і
деактівізірует його після повернення з цього методу
Нежорстко пов'язані події (Loosely Coupled
Events)
Керує подіями на основі об'єктів
Конструювання об'єктів (Object
Construction)
При створенні екземпляра класу передає йому
постійне строкове значення
Підтримка пулів об'єктів (Object Pooling) Надає пул готових об'єктів
Компоненти з чергами (Queued Components) Надає підтримку черг асинхронних
повідомлень
Захист на основі ролей (Role-Based Security) Застосовує дозволу захисту в залежності від
ролі
Загальні властивості (Shared Properties) Забезпечує спільне використання
інформації про стан кількома об'єктами в рамках серверного
процесу
Синхронізація [Synchronization (Activity)] Управляє доступом до загальних ресурсів
Взаємодія з XA (XA Interoperability) Забезпечує підтримку моделі обробки
транзакцій X / Open

Для чого потрібні сервіси COM + в. NET

Сервіси COM +, підтримувані в. NET, корисні при написанні програм
. NET, що використовують транзакції, захист на основі ролей і черги. . NET
спрощує реалізацію цих сервісів, як ви побачите в цьому документі.

Рада Якщо вашій. NET-кодом не потрібна взаємодія з
сервісами COM + (тобто планується, що він працюватиме виключно в
. NET Framework), не використовуйте System.EnterpriseServices, оскільки це
знижує продуктивність.

Огляд розробки COM +-компонентів

Створення. NET-компонентів, здатних до взаємодії з сервісами
COM +, включає наступні етапи (табл. 2).

  1. Створення бібліотеки класів.
  2. Визначення всіх класів як похідних від
    System.EnterpriseServices.ServicedComponents.
  3. Створення збірки.
  4. Створення суворого імені.

Табл. 2. Термінологія, яка використовується при розробці
. NET-компонентів

 

Термін Опис
Бібліотека класів (class library) Проект DLL, що містить класи. У загальному випадку
в проектах такого типу користувальницький інтерфейс не
передбачається.
System.EnterpriseServices.ServicedComponents Клас. NET Framework, необхідний для
взаємодії з сервісами COM +.
Збірка (assembly) Опис усіх класів і інтерфейсів в
проекті.
Суворе ім'я (strong name) Дозволяє генерувати GUID з збірки, щоб
ваш компонент міг реєструватися в COM + Services

Розробка компонентів, що підтримують транзакції

Нижче ви дізнаєтеся, як створюються. NET-компоненти, які використовують
транзакційні сервіси COM +. Ви також навчитеся писати компоненти й
взаємодіють з ними клієнтські програми.

Створення COM +-компонента, що підтримує транзакції

Щоб отримати. NET-компонент, який працює з сервісами COM +, потрібно
виконати ряд дій. Спочатку ви повинні створити клас, похідний від
System.EnterpriseServices.ServicedComponent. Цей базовий клас
надає вам всі методи і властивості, необхідні для взаємодії
з сервісами COM +. Далі позначте клас як вимагає нової транзакції, а
всі його методи, створювані вами, – як здатні автоматично
завершувати транзакції за відсутності помилок. Спробуємо зробити це на
практиці.

  1. Запустіть Microsoft Visual Studio ®. NET і створіть новий проект
    на основі шаблону ClassLibrary.
  2. Перейменуйте файл Class1.vb в COMPlusServices.vb.
  3. Відкрийте COMPlusServices.vb та змініть ім'я класу з Class1 на
    COMPlusServices
    .
  4. Помістіть в новий клас код, показаний нижче.
    Imports System.EnterpriseServices
    Imports System.Reflection
    
    "********************************************
    "Для реєстрації в COM +
    
    "Вкажіть ім'я COM +-програми
    <Assembly: ApplicationNameAttribute("ComPlusExample")> 
    
    "Вкажіть суворе ім'я збірки
    <Assembly: _ 
    AssemblyKeyFileAttribute ("bin / ComPlusExample.snk")>
    "********************************************
    
    <TransactionAttribute(TransactionOption.Required)> _
     Public Class COMPlusServices
        Inherits ServicedComponent 
    
        Public Sub New()
            MyBase.New()
        End Sub
    
        <AutoComplete()> Public Function DoTransaction() _
         As String
            Return "Success with COM+"
        End Function
    End Class
    

Спочатку в цьому коді імпортується пара просторів імен, щоб
виключити введення зайвого тексту при оголошенні компонентів.

Далі йде реєстрація в COM +. Помістіть в код наступний рядок:

"Вкажіть ім'я COM +-програми
<Assembly: ApplicationNameAttribute("ComPlusExample")>

У цьому рядку атрибуту ApplicationNameAttribute присвоюється
значення ComPlusExample – це і буде ім'ям COM +-додатки,
вказуються при реєстрації в каталозі COM +. Після першого виклику цього
компонента (коли ви відкриєте оснастку COM + Applications в консолі MMC)
ви побачите задане ім'я програми.

Потім в коді оголошується атрибут AssemblyKeyFileAttribute:

<Assembly: _ 
AssemblyKeyFileAttribute ("bin / ComPlusExample.snk")>

Він повідомляє каталогу COM +, де знаходиться інформація про суворе імені
збірки. SNK-файл, що описує компонент для COM +, ми створимо пізніше.

Нарешті, в коді оголошується клас COMPlusServices:

<TransactionAttribute(TransactionOption.Required)> _
 Public Public Class COMPlusServices

Атрибут перед ім'ям класу повідомляє COM +, що ви хочете встановити
транзакційний атрибут в Required. Те ж саме можна зробити вручну
через оснащення COM + Applications (рис. 1).

Наступний рядок коду вказує, що даний клас успадковується від
класу ServicedComponent з простору імен System.EnterpriseServices.

Inherits ServicedComponent 

Без цього наш компонент не зможе працювати в COM +.

Додавання транзакційного методу

Закінчивши налаштування класу, можна написати який-небудь метод,
робить реальну роботу. Створимо функцію DoTransaction, яка
повертає строкове значення і демонструє синтаксис методів,
необхідний для того, щоб вони могли брати участь у транзакціях.

<AutoComplete()> Public Function DoTransaction() As String
    Return "Success with COM+"
End Function

Важливо попередити метод атрибутом <AutoComplete()>. Цей атрибут
вказує, що якщо при виконанні методу не виникне виняток, за
його завершенні повинен бути автоматично викликаний SetComplete; в іншому
випадку виконуюча середовище. NET повинна сама викликати SetAbort. Це
відрізняється від написання компонентів COM в Visual Basic 6.0, де
програмістові доводилося явно викликати метод SetComplete або SetAbort.

Створення суворого імені

Перед компіляцією компонента необхідно призначити його збірці суворе
ім'я. Без цього каталог COM + не побачить ваш компонент і не зможе його
зареєструвати. Насправді ви вже зробили це через знайомий вам
атрибут AssemblyKeyFile, але тепер потрібно створити саме строге ім'я та
пов'язати GUID із збіркою за допомогою утиліти Strong Name Tool (Sn.exe).

  1. Відкрийте вікно командного рядка.
  2. Щоб створити суворе ім'я, наберіть наступну команду та натисніть
    Enter.

    sn -k ComPlusExample.snk
    
  3. Скопіюйте файл ComPlusExample.snk з кореневого каталогу
    жорсткого диска (швидше за все, це C: /) в каталог bin проекту (цей
    каталог знаходиться в каталозі вашого проекту).

Тепер скомпілюйте програму, щоб створити файли, необхідні для
реєстрації компонента в каталозі COM +. Для цього в Visual Studio. NET
виберіть з меню Build команду Build.

Створення тестового клієнтського додатка

Тепер, коли компонент зібраний, залишилося створити клієнтське
програми та протестувати цей компонент. Створіть просте консольне
програму, де метод Main стартового модуля створює екземпляр
компонента і викликає його метод DoTransaction (). Дотримуйтеся
такої схеми.

  1. У Visual Basic. NET створіть нове консольний додаток.
  2. Додайте в нього посилання на щойно створений компонент.
  3. Помістіть у додаток код, показаний нижче.
    Module modMain
        Sub Main()
            Dim objCOMPlus As New _ 
            COMPlusJumpStart.COMPlusServices()
    
            Console.WriteLine(objCOMPlus.DoTransaction)
            Console.ReadLine()
        End Sub
    End Module
    

Тестування

Нарешті, все готово для того, щоб запустити додаток і
подивитися, як воно працює.

  1. Відкрийте оснастку Component Services в консолі MMC і переконайтеся,
    що компонент динамічно зареєстрований в каталозі COM + (вікно
    оснащення має виглядати приблизно, як на рис. 2).
  2. Скомпілюйте і запустіть консольний додаток.

Рис. 2. Новий сервісний. NET-компонент в каталозі COM +

Захист на основі ролей

Якщо COM-компоненти, що працюють в COM +, викликаються безліччю
користувачів, стежте за тим, щоб доступ до компонентів отримували
тільки авторизовані користувачі. COM + дозволяє визначати роль і
призначати їх користувачам Windows NT. Призначивши ролі, визначте, які
компоненти (або навіть їх методи) доступні для цих ролей.

Додамо до класу COMPlusServices метод, який дозволить йому
підтримувати модель захисту на основі ролей. Ви створите роль Managers і
внесете в новий метод код, який перевіряє, чи є у викликає
користувача ця роль.

Організація підтримки захисту на основі ролей

Щоб створити нову роль безпеки, замість прямої модифікації
COM +-програми через оснащення Component Services додайте до проекту
новий атрибут. Ми додамо роль Managers за допомогою класу
SecurityRoleAttribute. Його конструктор приймає два аргументи:
рядковий role і логічний everyone. Аргумент role задає ім'я створюваної
ролі, а everyone визначає, чи треба додати вбудовану групу Everyone
до користувачів цієї ролі.

  1. Додайте до додатка COM + нову роль безпеки, помістивши
    наступний код відразу після коментаря "Реєстраційні відомості
    COM+":

    "********************************************
    "Реєстрація в COM +
    
    "Атрибут захисту на основі ролей
    <Assembly: SecurityRoleAttribute("Managers", False)>
    
  2. Змініть настройку рівня безпеки так, щоб перевірка
    доступу виконувалася на рівнях процесу і компонента.
  3. Відкрийте оснастку COM + Services.
  4. Перейдіть на вкладку Security і змініть рівень
    безпеки, як показано на рис. 3.

Рис. 3. Установка властивості Security level в COM + Catalog

Можна не робити все це вручну, а додати до компоненту атрибут,
змушує його перевіряти права доступу на рівні компонента. Нижче
зображений код, який слід додати в розділ "Реєстрація в COM +" в
початку класу COMPlusServices:

<Assembly: ApplicationAccessControlAttribute
(AccessChecksLevel: = AccessChecksLevelOption.ApplicationComponent)>

Перевірка на приналежність ролі

А тепер додамо до класу новий метод – IsManager. Він буде
перевіряти, чи є користувач членом ролі Managers. Цей метод –
не що інше, як функція, що повертає булево значення, яке
вказує, чи належить користувач до групи Managers. Щоб отримати
доступ до контексту захисту користувача, що викликає метод,
скористайтеся класом SecurityCallContext. Отримати поточний контекст
викликає можна методом CurrrentCall. Далі викличте метод
IsCallerInRole, вказавши Managers як ім'я ролі.

  1. Додайте в клас COMPlusServices показаний нижче метод:
    Public Function IsManager() As Boolean
    
        Dim objCallContext As SecurityCallContext = _ 
        SecurityCallContext.CurrentCall
        
        IsManager = _ 
        objCallContext.IsCallerInRole("Managers")
    
    End Function
    

    Щоб протестувати новий метод, наш компонент потрібно
    перекомпілювати.

  2. Для цього в Visual Studio. NET виберіть у меню Build
    команду Rebuild Solution.

Тестування

  1. Модифікуйте код методу Sub Main () клієнтського застосування, як
    показано нижче:

    Sub Main()
    
        Dim objCOMPlus As New _ 
        COMPlusJumpStart.COMPlusServices()
        
        Console.WriteLine(objCOMPlus.DoTransaction)
        Console.WriteLine(objCOMPlus.IsManager().ToString)
        Console.ReadLine()
    
    End Sub
    
  2. Запустіть консольний додаток з командного рядка, набравши в
    ній ім'я скомпільованого виконуваного файлу.

При першому запуску цього коду виникне виключення з повідомленням про
відхилення запиту на доступ, оскільки до ролі Managers поки не
додано жодного користувача. Щоб виправити це, додайте себе до
ролі Managers і запустіть клієнтську програму ще раз. На цей раз
винятків бути не повинно. У клієнтську програму також можна додати
обробку винятків. Ось як воно буде виглядати після додавання коду
для обробки виключень:

Sub Main()

Try

    Dim objCOMPlus As New _ 
    COMPlusJumpStart.COMPlusServices()

    Console.WriteLine(objCOMPlus.DoTransaction)
    Console.WriteLine(objCOMPlus.IsManager().ToString)
    Console.ReadLine()

Catch objException As Exception
    Console.WriteLine("An error occurred. " _ 
    & "Details:  " _ 
    & objException.Message)
    Console.ReadLine()

End Try

End Sub

Використання компонентів з підтримкою черг

Додати підтримку черг в COM +-додаток нескладно. Для цього
досить зробити його зовнішнім сервером (out-of-process server) і задати
на вкладці Queuing властивості Queued і Listen. Після цього клієнтське
додаток зможе викликати ваші компоненти як синхронно, так і
асинхронно. Витонченість цієї функції в тому, що модифіковані код
COM-об'єкта не потрібно – досить змінити його властивості в COM +
Catalog.

. NET Framework підтримує компоненти з чергами (queued
components), і, як ви, напевно, здогадуєтеся, для організації
підтримки черг у своїх компонентах змінювати їх властивості в каталозі
COM + вручну не обов'язково – можна скористатися відповідними
атрибутами.

Додамо до класу COMPlusServices метод, який ми будемо асинхронно
викликати з клієнтського. NET-додатки, використовуючи сервіси COM + Queued
Components.

  1. Зробіть своє COM +-додаток зовнішнім сервером (обов'язкове
    вимога для роботи з Queued Components). Щоб зробити це через
    атрибути, додайте до проекту наступний код:

    "********************************************
    
    "Реєстрація в COM +
    
    <Assembly: ApplicationActivationAttribute(ActivationOption.Server)>
    
  2. Тепер додайте до компоненту підтримку черг. Зробіть його
    доступним для черг MSMQ і змусьте його стежити за власною
    чергою для обробки повідомлень. Ось код, що дозволяє зробити це
    через атрибути:

    "********************************************
    
    "Реєстрація в COM +
    
    <Assembly: ApplicationQueuingAttribute(Enabled:=True, 
       QueueListenerEnabled:=True)>
    
  3. Додайте до класу метод QueueTest (як підпрограму, оскільки
    він не повинен нічого повертати). Нехай він записує повідомлення в
    журнал додатків Windows (Windows Application Log). Ось код цього
    методу:

    Public Sub QueueTest()
        System.Diagnostics.EventLog.WriteEntry(_ 
        "COMPlusServces", "Queue Test", _ 
        Diagnostics.EventLogEntryType.Error)
    End Sub
    

Все. Для організації підтримки черг у вашому компоненті більше
нічого не потрібно.

Тестування

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

  1. Створіть нове консольний додаток.
  2. Додайте в його процедуру Sub Main наступний код:
    Sub Main()
        Dim objTest As COMPlusJumpStart.COMPlusServices
        Dim strMoniker
    
        strMoniker = _ 
         "queue:/new:COMPlusJumpStart.COMPlusServices"
        objTest = GetObject(strMoniker)
        objTest.QueueTest()
    End Sub
    

Цей код асинхронно викликає метод QueueTest компонента. А для
синхронного виклику методу звертайтеся до нього так само, як ви робили це
при виклику будь-якого іншого методу компонента.

Тепер запустіть консольний додаток і перевірте, як працює
компонент з чергами.

Що нового з'явилося в COM + після Visual Basic 6.0?

Багато чого з того, що ви знали по Visual Basic 6.0 або COM, в. NET
залишилося без змін. Але тепер можна звести до мінімуму зусилля по
написання коду та супроводу програм, використовуючи інфраструктуру. NET
Framework, яка спрощує взаємодію між об'єктами.

Ось типовий приклад подібного удосконалення: в Visual Basic 6.0
програмістові доводилося самому явно викликати SetComplete або SetAbort,
а в. NET ці методи викликаються атрибутом <AutoComplete()>.

Інша відмінність між Visual Basic. NET і Visual Basic 6.0 в тому, що
компоненти Visual Basic 6.0 не можуть працювати з пулами об'єктів COM +,
оскільки використовують модель потоків STA (Single Threaded Apartment).
Компоненти Visual Basic. NET, будучи. NET-компонентами, підтримують
будь-які моделі потоків і, отже, можуть працювати з пулами об'єктів
COM+.

Резюме

Як бачите,. NET Framework дозволяє легко використовувати переваги
сервісів COM +. Це означає, що ви можете додавати нові. NET-компоненти
до існуючих програм, написаним з використанням COM / COM +, і вони
будуть без проблем працювати один з одним. Це дуже важливо, оскільки дає
нове життя існуючого коду, що використовує COM і COM +. Якщо ви пишете
новий додаток "з нуля", настійно рекомендуємо робити цей
виключно з використанням. NET Framework, що набагато ефективніше.

Про авторів

Тім Мак-Карти (Tim McCarthy) (MCSD, MCT) працює головним інженером в
InterKnowlogy, де займається проектуванням і розробкою
багаторівневих додатків з використанням останніх технологій
Microsoft. Регулярно виступає на DevDays, нещодавно завершив підбір
матеріалів навчального курсу з. NET для MSDN Field Content Team. Автор
ряду глав в кількох книгах, що вийшли у видавництві Wrox Press,
остання з них – "Professional VB.NET"; пише статтю в рубриці
"Developer DotNET Update" журналу "SQL Server Magazine".

Пол Д. Шериф (Paul D. Sheriff)
– Власник PDSA, Inc., Компанії, що займається консалтингом та розробкою
замовного ПЗ. Ця компанія розташована в Південній Каліфорнії, де Пол
є регіональним директором MSDN. Він автор книги "Paul Sheriff
Teaches Visual Basic ", присвяченої Visual Basic 6, а також 72 учбових
відеофільмів по Visual Basic, SQL Server,. NET та Web-розробці,
записаних для Keystone Learning Systems. Співавтор книги
www.informant.com)
– Медіа-компанія з різнобічними інтересами в секторі інформаційних
технологій. Спеціалізується на випуску видань і каталогів, проведенні
конференцій і створення Web-сайтів, присвячених розробці ПЗ. Заснована
в 1990 році і має відділення в США і Великобританії, ICG отримала
визнання як інтегратор медійного та маркетингового контенту, успішно
задовольняючи зростаючу потребу IT-професіоналів в якісній
технічної інформації.

© 2002 Informant Communications Group і Microsoft
Corporation
Технічне редагування виконано PDSA, Inc.

Схожі статті:


Сподобалася стаття? Ви можете залишити відгук або підписатися на RSS , щоб автоматично отримувати інформацію про нові статтях.

Коментарів поки що немає.

Ваш отзыв

Поділ на параграфи відбувається автоматично, адреса електронної пошти ніколи не буде опублікований, допустимий HTML: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>

*

*