Π§ΠΈΡ‚Π°ΠΉΡ‚Π΅ ΠΊΠ½ΠΈΠ³ΠΈ ΠΎΠ½Π»Π°ΠΉΠ½ Π½Π° Bookidrom.ru! БСсплатныС ΠΊΠ½ΠΈΠ³ΠΈ Π² ΠΎΠ΄Π½ΠΎΠΌ ΠΊΠ»ΠΈΠΊΠ΅

Π§ΠΈΡ‚Π°Ρ‚ΡŒ ΠΎΠ½Π»Π°ΠΉΠ½ Β«C# для профСссионалов. Π’ΠΎΠΌ IIΒ». Π‘Ρ‚Ρ€Π°Π½ΠΈΡ†Π° 61

Автор Π‘ΠΈΠΌΠΎΠ½ Робинсон

Regsvcs .NetComponentName [COM+AppName] [TypeLibrary.tlb]

Π‘ ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ Π²Ρ‚ΠΎΡ€ΠΎΠ³ΠΎ Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚Π° (COM+AppName) ΠΌΠΎΠΆΠ½ΠΎ ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΠΈΡ‚ΡŒ Π΄Ρ€ΡƒΠ³ΠΎΠ΅ имя для создаваСмого прилоТСния COM+, прСдоставляя Π²Ρ‚ΠΎΡ€ΠΎΠΉ Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚ ΠΊΠΎΠΌΠ°Π½Π΄Π½ΠΎΠΉ строки ΠΏΡ€ΠΈ Π²Ρ‹Π·ΠΎΠ²Π΅ RegSvcs. Для Π΅Ρ‰Π΅ большСй гибкости ΠΌΠΎΠΆΠ½ΠΎ ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΠΈΡ‚ΡŒ имя Ρ„Π°ΠΉΠ»Π° Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠΈ Ρ‚ΠΈΠΏΠΎΠ², которая создаСтся ΠΏΡ€ΠΈ прСдоставлСнии Ρ‚Ρ€Π΅Ρ‚ΡŒΠ΅Π³ΠΎ Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚Π° (TypeLibrary.tlb). Π–Π΅Π»Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎ всСгда ΠΏΡ€Π΅Π΄ΠΎΡΡ‚Π°Π²Π»ΡΡ‚ΡŒ эти Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚Ρ‹ ΠΏΡ€ΠΈ Π²Ρ‹Π·ΠΎΠ²Π΅ RegSvcs, Ρ‚Π°ΠΊ ΠΊΠ°ΠΊ Π±ΠΎΠ»Π΅Π΅ Ρ€Π°Π½Π½ΠΈΠ΅ вСрсии этой ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹ Π±ΡƒΠ΄ΡƒΡ‚ ΠΌΠΎΠ»Ρ‡Π°Π»ΠΈΠ²ΠΎ ΠΏΠ΅Ρ€Π΅Π·Π°ΠΏΠΈΡΡ‹Π²Π°Ρ‚ΡŒ Π»ΡŽΠ±Ρ‹Π΅ ΡΡƒΡ‰Π΅ΡΡ‚Π²ΡƒΡŽΡ‰ΠΈΠ΅ Ρ„Π°ΠΉΠ»Ρ‹, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΌΠΎΠ³ΡƒΡ‚ ΠΈΠΌΠ΅Ρ‚ΡŒ Ρ‚Π°ΠΊΠΈΠ΅ ΠΆΠ΅ ΠΈΠΌΠ΅Π½Π°, ΠΊΠ°ΠΊ Ρƒ вновь создаваСмых Ρ„Π°ΠΉΠ»ΠΎΠ².

ΠŸΡ€Π΅Π΄Π²Π°Ρ€ΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹Π΅ ΠΈΡ‚ΠΎΠ³ΠΈ

Π’Π΅ΠΏΠ΅Ρ€ΡŒ ΠΌΡ‹ Π·Π½Π°Π΅ΠΌ, ΠΊΠ°ΠΊ ΠΏΠΎΠ΄Π³ΠΎΡ‚ΠΎΠ²ΠΈΡ‚ΡŒ сборку .NET для примСнСния вмСстС со слуТбами COM+. Π­Ρ‚Π° ΠΏΠΎΠ΄Π³ΠΎΡ‚ΠΎΠ²ΠΊΠ° Π²ΠΊΠ»ΡŽΡ‡Π°Π΅Ρ‚ Π² сСбя:

β–‘ БнаряТСниС сборки Ρ€Π΅ΠΊΠΎΠΌΠ΅Π½Π΄ΠΎΠ²Π°Π½Π½Ρ‹ΠΌΠΈ Π°Ρ‚Ρ€ΠΈΠ±ΡƒΡ‚Π°ΠΌΠΈ сборки

β–‘ Π‘ΠΎΠ΅Π΄ΠΈΠ½Π΅Π½ΠΈΠ΅ классов прокси с Π²Π½ΡƒΡ‚Ρ€Π΅Π½Π½ΠΈΠΌΠΈ "Ρ€Π°Π±ΠΎΡ‡ΠΈΠΌΠΈ" классами посрСдством Π°Ρ‚Ρ€ΠΈΠ±ΡƒΡ‚Π° ComEmulate

β–‘ Π Π°Π·Π²Π΅Ρ€Ρ‚Ρ‹Π²Π°Π½ΠΈΠ΅ сборок с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ sn.exe, al.exe ΠΈ, Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎ, RegSvcs.exe

ИмСя ΠΎΠ±Ρ‰ΡƒΡŽ ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΡŽ, ΠΏΠ΅Ρ€Π΅ΠΉΠ΄Π΅ΠΌ ΠΊ ΠΎΠ±ΡΡƒΠΆΠ΄Π΅Π½ΠΈΡŽ использования ΠΊΠΎΠ½ΠΊΡ€Π΅Ρ‚Π½Ρ‹Ρ… слуТб COM+ ΠΈΠ· сборок .NET. НачнСм с Ρ‚Ρ€Π°Π½Π·Π°ΠΊΡ†ΠΈΠΉ.

ИспользованиС Ρ‚Ρ€Π°Π½Π·Π°ΠΊΡ†ΠΈΠΉ со сборками .NET

Π‘ΡƒΡ‰Π΅ΡΡ‚Π²ΡƒΡŽΡ‚ Π΄Π²Π΅ Π²Π΅Ρ‰ΠΈ, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ ΡΠ΄Π΅Π»Π°Ρ‚ΡŒ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΏΠΎΠ΄Π³ΠΎΡ‚ΠΎΠ²ΠΈΡ‚ΡŒ класс .NET для Ρ‚Ρ€Π°Π½Π·Π°ΠΊΡ†ΠΈΠΉ. ΠŸΠ΅Ρ€Π²ΠΎΠ΅: Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ ΠΈΠ·ΠΌΠ΅Π½ΠΈΡ‚ΡŒ прокси класса с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ Π°Ρ‚Ρ€ΠΈΠ±ΡƒΡ‚Π° для указания Π΅Π³ΠΎ уровня ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΊΠΈ Ρ‚Ρ€Π°Π½Π·Π°ΠΊΡ†ΠΈΠΉ. Π’Ρ‚ΠΎΡ€ΠΎΠ΅: Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ Π΄ΠΎΠ±Π°Π²ΠΈΡ‚ΡŒ Π² класс ΠΊΠΎΠ΄ для управлСния Π΅Π³ΠΎ ΠΏΠΎΠ²Π΅Π΄Π΅Π½ΠΈΠ΅ΠΌ, ΠΊΠΎΠ³Π΄Π° ΠΎΠ½ участвуСт Π² транзакциях.

Вспомним ΠΊΠΎΠ½Ρ†Π΅ΠΏΡ†ΠΈΡŽ "контСкста" Ρ‚Ρ€Π°Π½Π·Π°ΠΊΡ†ΠΈΠΈ, которая Π±Ρ‹Π»Π° рассмотрСна Π²Ρ‹ΡˆΠ΅. Она ΠΈΠ³Ρ€Π°Π΅Ρ‚ здСсь Π²Π°ΠΆΠ½ΡƒΡŽ Ρ€ΠΎΠ»ΡŒ, поэтому ΠΊ Π½Π΅ΠΉ ΠΌΠΎΠΆΠ½ΠΎ Π²Π΅Ρ€Π½ΡƒΡ‚ΡŒΡΡ для быстрого повторСния.

ΠžΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ΠΈΠ΅ Ρ‚Ρ€Π°Π½Π·Π°ΠΊΡ†ΠΈΠΎΠ½Π½ΠΎΠΉ ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΊΠΈ

Π Π°Π½Π΅Π΅ ΠΏΡ€ΠΈ использовании Ρ‚Ρ€Π°Π½Π·Π°ΠΊΡ†ΠΈΠΉ ΠΈΠ· слуТб COM+ ΠΌΠΎΠΆΠ½ΠΎ Π±Ρ‹Π»ΠΎ ΡƒΠ²ΠΈΠ΄Π΅Ρ‚ΡŒ настройку уровня Ρ‚Ρ€Π°Π½Π·Π°ΠΊΡ†ΠΈΠΉ Π² ΠΎΠΊΠ½Π΅ свойств класса Π² Snap-In слуТбы ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚ΠΎΠ². Π­Ρ‚Π° настройка позволяСт Π·Π°Π΄Π°Ρ‚ΡŒ ΡƒΡ€ΠΎΠ²Π΅Π½ΡŒ ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΊΠΈ Ρ‚Ρ€Π°Π½Π·Π°ΠΊΡ†ΠΈΠΉ, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ слуТбы COM+ Π±ΡƒΠ΄ΡƒΡ‚ ΠΏΡ€Π΅Π΄ΠΎΡΡ‚Π°Π²Π»ΡΡ‚ΡŒ стандартному ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚Ρƒ COM.

Π˜Π½Π°Ρ‡Π΅ Π² .NET ΡƒΡ€ΠΎΠ²Π΅Π½ΡŒ ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΊΠΈ Ρ‚Ρ€Π°Π½Π·Π°ΠΊΡ†ΠΈΠΉ Π² сборкС ΠΌΠΎΠΆΠ½ΠΎ ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΠΈΡ‚ΡŒ Π½Π΅ с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ графичСского ΠΎΠΊΠ½Π° Π² snap-in слуТбы ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚ΠΎΠ², Π° ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ½Ρ‹ΠΌ ΠΏΡƒΡ‚Π΅ΠΌ с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ Π°Ρ‚Ρ€ΠΈΠ±ΡƒΡ‚Π° Transaction, ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½Π½ΠΎΠ³ΠΎ Π² пространствС ΠΈΠΌΠ΅Π½ EnterpriseServices. Π’ ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π΅ Π½ΠΈΠΆΠ΅ ΠΌΡ‹ опрСдСляСм, Ρ‡Ρ‚ΠΎ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΉ класс прокси Π΄ΠΎΠ»ΠΆΠ΅Π½ ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΈΠ²Π°Ρ‚ΡŒ Ρ‚Ρ€Π°Π½Π·Π°ΠΊΡ†ΠΈΠΈ. ΠŸΡ€ΠΈ Π·Π°Π΄Π°Π½Π½ΠΎΠΌ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠΈ Π°Ρ‚Ρ€ΠΈΠ±ΡƒΡ‚Π° ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚ Π±ΡƒΠ΄Π΅Ρ‚ сконфигурирован для ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΊΠΈ Ρ‚Ρ€Π°Π½Π·Π°ΠΊΡ†ΠΈΠΉ, ΠΊΠΎΠ³Π΄Π° ΠΎΠ½ импортируСтся Π² слуТбы COM+ с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ RegSvcs.exe.

[Transaction(TransactionOption.Supported)]

public class ProxyClass:ServicedComponent {

}

Supported являСтся Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΎΠ΄Π½ΠΈΠΌ ΠΈΠ· Π½Π΅ΡΠΊΠΎΠ»ΡŒΠΊΠΈΡ… Π·Π½Π°Ρ‡Π΅Π½ΠΈΠΉ, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΌΠΎΠΆΠ½ΠΎ ΠΏΡ€ΠΈΡΠ²ΠΎΠΈΡ‚ΡŒ Π°Ρ‚Ρ€ΠΈΠ±ΡƒΡ‚Ρƒ Transaction ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚Π°. ЀактичСски, сущСствуСт Ρ‡Π΅Ρ‚Ρ‹Ρ€Π΅ значСния, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ прСдставлСны Π² пСрСчислСнии TransactionOption, ΡΠ²Π»ΡΡŽΡ‰Π΅ΠΌΡΡ Ρ‡Π°ΡΡ‚ΡŒΡŽ пространства ΠΈΠΌΠ΅Π½ System.EnterpriseServices.

β–‘ ΠšΠΎΠ³Π΄Π° Π°Ρ‚Ρ€ΠΈΠ±ΡƒΡ‚ Transaction класса Π·Π°Π΄Π°Π½ ΠΊΠ°ΠΊ Disabled, слуТбы COM+ Π½Π΅ ΠΏΡ€Π΅Π΄ΠΎΡΡ‚Π°Π²Π»ΡΡŽΡ‚ Ρ‚Ρ€Π°Π½Π·Π°ΠΊΡ†ΠΈΠΎΠ½Π½ΠΎΠΉ ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΊΠΈ для класса, Π΄Π°ΠΆΠ΅ Ссли такая ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΊΠ° ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½Π° Π³Π΄Π΅-Ρ‚ΠΎ Π² ΠΊΠΎΠ΄Π΅. (Π”Ρ€ΡƒΠ³ΠΈΠΌΠΈ словами, Π²Ρ‹Π·ΠΎΠ²Ρ‹ этого класса, сдСланныС для ContextUtil с Ρ†Π΅Π»ΡŒΡŽ фиксации ΠΈΠ»ΠΈ ΠΎΡ‚ΠΌΠ΅Π½Ρ‹ Ρ‚Ρ€Π°Π½Π·Π°ΠΊΡ†ΠΈΠΉ, ΠΈΠ³Π½ΠΎΡ€ΠΈΡ€ΡƒΡŽΡ‚ΡΡ. ΠœΡ‹ познакомимся с ContextUtil Π² ΡΠ»Π΅Π΄ΡƒΡŽΡ‰Π΅ΠΌ Ρ€Π°Π·Π΄Π΅Π»Π΅.)

β–‘ ΠšΠΎΠ³Π΄Π° Π°Ρ‚Ρ€ΠΈΠ±ΡƒΡ‚ Transaction класса Π·Π°Π΄Π°Π½ ΠΊΠ°ΠΊ NotSupported, Ρ‚Π°ΠΊΠΎΠΉ класс Π½Π΅ вовлСкаСтся Π² Ρ‚Ρ€Π°Π½Π·Π°ΠΊΡ†ΠΈΠΈ, запускаСмыС Π΅Π³ΠΎ ΠΊΠ»ΠΈΠ΅Π½Ρ‚Π°ΠΌΠΈ, Π΄Ρ€ΡƒΠ³ΠΈΠΌΠΈ словами ΠΎΠ½ Π½Π΅ помСщаСтся Π² ΠΈΡ… контСкст. Π’ Π΄Π°Π½Π½ΠΎΠΉ ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΠΈ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Ρ‹ этого класса Π½Π΅ ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΡΡŽΡ‚, Π±ΡƒΠ΄Π΅Ρ‚ Π»ΠΈ вызываСмая транзакция Ρ„ΠΈΠΊΡΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒΡΡ ΠΈΠ»ΠΈ ΠΎΡ‚ΠΌΠ΅Π½ΡΡ‚ΡŒΡΡ.

β–‘ ΠšΠΎΠ³Π΄Π° Π°Ρ‚Ρ€ΠΈΠ±ΡƒΡ‚ Transaction класса Π·Π°Π΄Π°Π½ ΠΊΠ°ΠΊ Supported, ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Ρ‹ этого класса ΠΌΠΎΠ³ΡƒΡ‚ Π²ΠΎΠ²Π»Π΅ΠΊΠ°Ρ‚ΡŒΡΡ Π² контСкст Ρ‚Ρ€Π°Π½Π·Π°ΠΊΡ†ΠΈΠΉ своих Π²Ρ‹Π·Ρ‹Π²Π°ΡŽΡ‰ΠΈΡ… ΠΊΠ»ΠΈΠ΅Π½Ρ‚ΠΎΠ², Ссли эти Π²Ρ‹Π·Ρ‹Π²Π°ΡŽΡ‰ΠΈΠ΅ ΠΊΠ»ΠΈΠ΅Π½Ρ‚Ρ‹ Π½Π° самом Π΄Π΅Π»Π΅ Π½Π°Ρ‡ΠΈΠ½Π°ΡŽΡ‚ Ρ‚Ρ€Π°Π½Π·Π°ΠΊΡ†ΠΈΡŽ. Π’Π°ΠΊΠΎΠΉ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ Π½Π΅ ΠΌΠΎΠΆΠ΅Ρ‚ ΡΠ°ΠΌΠΎΡΡ‚ΠΎΡΡ‚Π΅Π»ΡŒΠ½ΠΎ ΠΏΠΎΡ€ΠΎΠΆΠ΄Π°Ρ‚ΡŒ Ρ‚Ρ€Π°Π½Π·Π°ΠΊΡ†ΠΈΡŽ.

β–‘ ΠšΠΎΠ³Π΄Π° Π°Ρ‚Ρ€ΠΈΠ±ΡƒΡ‚ Transaction класса Π·Π°Π΄Π°Π½ ΠΊΠ°ΠΊ Required, слуТбы COM+ Π·Π½Π°ΡŽΡ‚, Ρ‡Ρ‚ΠΎ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Ρ‹ этого класса ΠΌΠΎΠ³ΡƒΡ‚ Π²Ρ‹ΠΏΠΎΠ»Π½ΡΡ‚ΡŒΡΡ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Π² контСкстС Ρ‚Ρ€Π°Π½Π·Π°ΠΊΡ†ΠΈΠΈ. Если Ρ‚Π°ΠΊΠΎΠΉ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ вызываСтся ΠΊΠ»ΠΈΠ΅Π½Ρ‚ΠΎΠΌ, ΠΈΠΌΠ΅ΡŽΡ‰Π΅ΠΌ Ρ‚Ρ€Π°Π½Π·Π°ΠΊΡ†ΠΈΠΎΠ½Π½Ρ‹ΠΉ контСкст, ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ наслСдуСт контСкст Ρ‚Ρ€Π°Π½Π·Π°ΠΊΡ†ΠΈΠΈ ΠΊΠ»ΠΈΠ΅Π½Ρ‚Π°. Если, ΠΎΠ΄Π½Π°ΠΊΠΎ, ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ вызываСтся ΠΊΠ»ΠΈΠ΅Π½Ρ‚ΠΎΠΌ, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ Π½Π΅ ΠΈΠΌΠ΅Π΅Ρ‚ Ρ‚Ρ€Π°Π½Π·Π°ΠΊΡ†ΠΈΠΎΠ½Π½ΠΎΠ³ΠΎ контСкста, слуТбы COM+ ΡΠΎΠ·Π΄Π°ΡŽΡ‚ контСкст для этого ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π°.

β–‘ ΠšΠΎΠ³Π΄Π° Π°Ρ‚Ρ€ΠΈΠ±ΡƒΡ‚ Transaction класса Π·Π°Π΄Π°Π½ ΠΊΠ°ΠΊ RequiresNew, слуТбы COM+ ΡΠΎΠ·Π΄Π°ΡŽΡ‚ Π½ΠΎΠ²ΡƒΡŽ Ρ‚Ρ€Π°Π½Π·Π°ΠΊΡ†ΠΈΡŽ для класса ΠΊΠ°ΠΆΠ΄Ρ‹ΠΉ Ρ€Π°Π·, ΠΊΠΎΠ³Π΄Π° ΠΎΠ½ вызываСтся. Π”Π°ΠΆΠ΅ Ссли ΠΊΠ»ΠΈΠ΅Π½Ρ‚ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π° ΡƒΠΆΠ΅ ΠΈΠΌΠ΅Π΅Ρ‚ Ρ‚Ρ€Π°Π½Π·Π°ΠΊΡ†ΠΈΡŽ, слуТбы COM+ ΡΠΎΠ·Π΄Π°ΡŽΡ‚ Π½ΠΎΠ²ΡƒΡŽ Ρ‚Ρ€Π°Π½Π·Π°ΠΊΡ†ΠΈΡŽ для сСрвСрного ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π°. Как ΠΌΠΎΠΆΠ½ΠΎ Π΄ΠΎΠ³Π°Π΄Π°Ρ‚ΡŒΡΡ, классы, сконфигурированныС ΠΏΠΎΠ΄ΠΎΠ±Π½Ρ‹ΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ, способны ΠΎΡ‚ΠΌΠ΅Π½ΠΈΡ‚ΡŒ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ свои собствСнныС Ρ‚Ρ€Π°Π½Π·Π°ΠΊΡ†ΠΈΠΈ, Π° Π½Π΅ Ρ€Π°Π±ΠΎΡ‚Ρƒ своих ΠΊΠ»ΠΈΠ΅Π½Ρ‚ΠΎΠ².

На ΠΏΡ€Π°ΠΊΡ‚ΠΈΠΊΠ΅ Π±ΠΎΠ»ΡŒΡˆΠΈΠ½ΡΡ‚Π²ΠΎ Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊΠΎΠ² ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡ‚ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΎΠ΄Π½Ρƒ ΠΈΠ»ΠΈ Π΄Π²Π΅ ΠΈΠ· этих настроСк. Π—Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ Supported ΠΏΠΎΠ΄Ρ…ΠΎΠ΄ΠΈΡ‚ для классов Ρ‚ΠΈΠΏΠ° класса Settings , ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΌΡƒ Π½ΡƒΠΆΠ½ΠΎ Π±ΡƒΠ΄Π΅Ρ‚ ΠΎΠ±ΡΠ»ΡƒΠΆΠΈΠ²Π°Ρ‚ΡŒ классы с транзакциями ΠΈ Π±Π΅Π· Ρ‚Ρ€Π°Π½Π·Π°ΠΊΡ†ΠΈΠΉ. Для Π±ΠΎΠ»ΡŒΡˆΠΈΠ½ΡΡ‚Π²Π° Π΄Ρ€ΡƒΠ³ΠΈΡ… Ρ‚Ρ€Π°Π½Π·Π°ΠΊΡ†ΠΈΠΎΠ½Π½Ρ‹Ρ… классов ΠΌΠΎΠΆΠ½ΠΎ ΡΠΏΡ€Π°Π²ΠΈΡ‚ΡŒΡΡ, задавая Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ Required. Однако всС-Ρ‚Π°ΠΊΠΈ ΠΌΠΎΠΆΠ΅Ρ‚ Π²ΠΎΠ·Π½ΠΈΠΊΠ½ΡƒΡ‚ΡŒ ситуация, Π³Π΄Π΅ ΠΏΠΎΡ‚Ρ€Π΅Π±ΡƒΡŽΡ‚ΡΡ ΠΎΠ΄Π½ΠΎ ΠΈΠ»ΠΈ нСсколько составных Π·Π½Π°Ρ‡Π΅Π½ΠΈΠΉ, Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡ‚Π΅Π»ΡŒΠ½ΡƒΡŽ ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΡŽ ΠΌΠΎΠΆΠ½ΠΎ Π½Π°ΠΉΡ‚ΠΈ Π² ΠΊΠ½ΠΈΠ³Π΅ "Professinal Windows DNA Programming" (ISBN 1-861004-45-1) ΠΈΠ·Π΄Π°Ρ‚Π΅Π»ΡŒΡΡ‚Π²Π° Wrox Press.

ΠšΠΎΠ΄ΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ Ρ‚Ρ€Π°Π½Π·Π°ΠΊΡ†ΠΈΠΉ с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ ContextUtil

ΠœΠΎΠ΄ΠΈΡ„ΠΈΠΊΠ°Ρ†ΠΈΡ класса с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ Π°Ρ‚Ρ€ΠΈΠ±ΡƒΡ‚Π° Transaction являСтся Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Ρ‡Π°ΡΡ‚ΡŒΡŽ Ρ‚ΠΎΠ³ΠΎ, Ρ‡Ρ‚ΠΎ Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ ΡΠ΄Π΅Π»Π°Ρ‚ΡŒ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΏΠΎΠ΄Π³ΠΎΡ‚ΠΎΠ²ΠΈΡ‚ΡŒ Π΅Π³ΠΎ для участия Π² Ρ‚Ρ€Π°Π½Π·Π°ΠΊΡ†ΠΈΠΈ. Надо Ρ‚Π°ΠΊΠΆΠ΅ ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΠΈΡ‚ΡŒ, ΠΊΠ°ΠΊ ΠΊΠ°ΠΆΠ΄Ρ‹ΠΉ ΠΌΠ΅Ρ‚ΠΎΠ΄ Π² этом классС Π²Π΅Π΄Π΅Ρ‚ сСбя, ΠΊΠΎΠ³Π΄Π° ΠΎΠ½ вызываСтся ΠΊΠ°ΠΊ Ρ‡Π°ΡΡ‚ΡŒ Ρ‚Ρ€Π°Π½Π·Π°ΠΊΡ†ΠΈΠΈ. Π­Ρ‚ΠΎ осущСствляСтся с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ класса ContextUtil ΠΈΠ· пространства ΠΈΠΌΠ΅Π½ System.EnterpriseServices.

ΠŸΡ€ΠΎΡ‰Π΅ говоря, класс ContextUtil прСдоставляСт контСкст Ρ‚Ρ€Π°Π½Π·Π°ΠΊΡ†ΠΈΠΈ. Когда имССтся ссылка Π½Π° контСкст Ρ‚Ρ€Π°Π½Π·Π°ΠΊΡ†ΠΈΠΈ, ΠΌΠΎΠΆΠ½ΠΎ явно Π·Π°ΡΡ‚Π°Π²ΠΈΡ‚ΡŒ этот контСкст Π·Π°Ρ„ΠΈΠΊΡΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ ΠΈΠ»ΠΈ ΠΎΡ‚ΠΌΠ΅Π½ΠΈΡ‚ΡŒ Ρ‚Ρ€Π°Π½Π·Π°ΠΊΡ†ΠΈΡŽ. ΠœΠ΅Ρ‚ΠΎΠ΄Ρ‹, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ Π²Ρ‹Π·Π²Π°Ρ‚ΡŒ для фиксации ΠΈΠ»ΠΈ ΠΎΡ‚ΠΌΠ΅Π½Ρ‹ Ρ‚Ρ€Π°Π½Π·Π°ΠΊΡ†ΠΈΠΉ, ΠΏΡ€Π΅Π΄ΡΡ‚Π°Π²Π»ΡΡŽΡ‚ΡΡ ΠΊΠ°ΠΊ ΠΌΠ΅Ρ‚ΠΎΠ΄Ρ‹ класса Π² классС ContextUtil, поэтому Π½Π΅ придСтся ΡΠΎΠ·Π΄Π°Π²Π°Ρ‚ΡŒ экзСмпляр класса ContextUtil, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΈΡ… Π²Ρ‹Π·Π²Π°Ρ‚ΡŒ.

Π’ качСствС ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π° сдСлаСм ΠΊΡ€Π°Ρ‚ΠΊΠΈΠΉ ΠΎΠ±Π·ΠΎΡ€ Ρ„Ρ€Π°Π³ΠΌΠ΅Π½Ρ‚Π° ΠΊΠΎΠ΄Π°, ΠΏΡ€ΠΈΠ²Π΅Π΄Π΅Π½Π½ΠΎΠ³ΠΎ Π½ΠΈΠΆΠ΅.

public bool PlaceOrder(bool CommitTrans) {

 // ΠŸΠΎΠΏΡ‹Ρ‚ΠΊΠ° Ρ€Π°Π±ΠΎΡ‚Ρ‹

 try {

  if (CommitTrans) {

   // Π­Ρ‚Π° транзакция Π΄ΠΎΠ»ΠΆΠ½Π° Π±Ρ‹Ρ‚ΡŒ зафиксирована

   // шаг 1 β€” ΡƒΠ²Π΅Π»ΠΈΡ‡ΠΈΡ‚ΡŒ число Π΅Π΄ΠΈΠ½ΠΈΡ† ΠΏΡ€ΠΎΠ΄ΡƒΠΊΡ‚Π° ID=2 Π½Π° 10

   IncreaseUnits(2, 10);

   // шаг 2 β€” ΡΠΎΠΊΡ€Π°Ρ‚ΠΈΡ‚ΡŒ запас ΠΏΡ€ΠΎΠ΄ΡƒΠΊΡ‚Π° ID=2 Π½Π° 10 Π΅Π΄ΠΈΠ½ΠΈΡ†

   ReduceStock(2, 10);

  } else {

   // Π­Ρ‚Π° транзакция Π΄ΠΎΠ»ΠΆΠ½Π° Π±Ρ‹Ρ‚ΡŒ ΠΎΡ‚ΠΌΠ΅Π½Π΅Π½Π°

   // шаг 1 β€” ΡƒΠ²Π΅Π»ΠΈΡ‡ΠΈΡ‚ΡŒ число Π΅Π΄ΠΈΠ½ΠΈΡ† ΠΏΡ€ΠΎΠ΄ΡƒΠΊΡ‚Π° ID=5 Π½Π° 5 Π΅Π΄ΠΈΠ½ΠΈΡ†

   IncreaseUnits(5, 5);

   // шаг 2 - ΡΠΎΠΊΡ€Π°Ρ‚ΠΈΡ‚ΡŒ запас ΠΏΡ€ΠΎΠ΄ΡƒΠΊΡ‚Π° ID=5 Π½Π° 5 Π΅Π΄ΠΈΠ½ΠΈΡ†

   ReduceStock(5, 5);

  }

  // Если всС ΠΏΡ€ΠΎΡˆΠ»ΠΎ Ρ…ΠΎΡ€ΠΎΡˆΠΎ, Π·Π°Π²Π΅Ρ€ΡˆΠΈΡ‚ΡŒ Ρ‚Ρ€Π°Π½Π·Π°ΠΊΡ†ΠΈΡŽ.

  ContextUtil.SetComplete();

  return true;

 }

 // Π­Ρ‚ΠΎΡ‚ ΠΊΠΎΠ΄ выполняСтся, Ссли встрСчаСтся ошибка.

 catch (Exception Π΅) {

  // ΠžΡ‚ΠΌΠ΅Π½ΠΈΡ‚ΡŒ Ρ€Π°Π±ΠΎΡ‚Ρƒ, ΠΊΠΎΡ‚ΠΎΡ€ΡƒΡŽ Π²Ρ‹ΠΏΠΎΠ»Π½ΠΈΠ»Π° эта функция.

  ContextUtil.SetAbort();

  return false;

 }

}

Π§Ρ‚ΠΎ здСсь происходит?

ΠœΡ‹ ΠΈΠΌΠ΅Π΅ΠΌ Π΄Π²Π΅ Ρ‚Ρ€Π°Π½Π·Π°ΠΊΡ†ΠΈΠΈ, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΎΠ±Ρ€Π°Π±Π°Ρ‚Ρ‹Π²Π°ΡŽΡ‚ΡΡ Π² зависимости ΠΎΡ‚ значСния CommitTrans. Для любой Ρ‚Ρ€Π°Π½Π·Π°ΠΊΡ†ΠΈΠΈ PlaceOrder() Π²Ρ‹Π·Ρ‹Π²Π°Π΅Ρ‚ Π΄Π²Π° ΠΌΠ΅Ρ‚ΠΎΠ΄Π°, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΎΠ±Π° ΡΠΎΠ΅Π΄ΠΈΠ½ΡΡŽΡ‰ΠΈΠ΅ΡΡ с Π±Π°Π·ΠΎΠΉ Π΄Π°Π½Π½Ρ‹Ρ… Northwind, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΡΠ΄Π΅Π»Π°Ρ‚ΡŒ измСнСния Π² Ρ‚Π°Π±Π»ΠΈΡ†Π΅ Product. ΠœΠ΅Ρ‚ΠΎΠ΄ ReduceStock() сокращаСт объСм запасов Π² столбцС UnitsInStock, ΠΌΠ΅Ρ‚ΠΎΠ΄ IncreaseUnits() ΡƒΠ²Π΅Π»ΠΈΡ‡ΠΈΠ²Π°Π΅Ρ‚ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ столбца UnitsOnOrder(). Для ΠΎΠ±ΠΎΠΈΡ… ΠΌΠ΅Ρ‚ΠΎΠ΄ΠΎΠ² ΠΏΠ΅Ρ€Π²Ρ‹ΠΌ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ΠΎΠΌ являСтся ProductID Π² строкС, ΠΊΠΎΡ‚ΠΎΡ€ΡƒΡŽ Π½ΡƒΠΆΠ½ΠΎ ΠΈΠ·ΠΌΠ΅Π½ΠΈΡ‚ΡŒ, Π²Ρ‚ΠΎΡ€ΠΎΠΉ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ Π΅ΡΡ‚ΡŒ Π²Π΅Π»ΠΈΡ‡ΠΈΠ½Π°, Π½Π° ΠΊΠΎΡ‚ΠΎΡ€ΡƒΡŽ ΠΌΡ‹ Ρ…ΠΎΡ‚ΠΈΠΌ ΠΈΠ·ΠΌΠ΅Π½ΠΈΡ‚ΡŒ ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽΡ‰ΠΈΠΉ столбСц.

Π’Ρ‹ΠΏΠΎΠ»Π½ΡΡŽΡ‰Π°ΡΡΡ транзакция контролируСтся Π±ΡƒΠ»Π΅Π²ΠΎΠΉ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉ CommitTrans, ΠΏΠ΅Ρ€Π΅Π΄Π°Π²Π°Π΅ΠΌΠΎΠΉ Π² PlaceOrder(). ΠŸΠ΅Ρ€Π²Π°Ρ транзакция Π΄ΠΎΠ»ΠΆΠ½Π° Π±Ρ‹Ρ‚ΡŒ зафиксирована, Ρ‚Π°ΠΊ ΠΊΠ°ΠΊ ΡƒΡ€ΠΎΠ²Π΅Π½ΡŒ запаса для ProductID=2 Ρ€Π°Π²Π΅Π½ 17, ΡΠ»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎ, ΠΌΠΎΠΆΠ½ΠΎ ΡƒΠ΄Π°Π»ΠΈΡ‚ΡŒ Π΄Π΅ΡΡΡ‚ΡŒ элСмСнтов ΠΈ всС Π΅Ρ‰Π΅ ΠΈΠΌΠ΅Ρ‚ΡŒ ΠΎΡΡ‚Π°Π²ΡˆΠΈΠΉΡΡ запас. Однако вторая транзакция ΠΎΠ±Ρ€Π΅Ρ‡Π΅Π½Π° Π½Π° ΠΎΡ‚ΠΊΠ°Π· Ρ‚Π°ΠΊ ΠΊΠ°ΠΊ ProductID=5 Π½Π΅ ΠΈΠΌΠ΅Π΅Ρ‚ запаса элСмСнтов ΠΈ сущСствуСт ΠΎΠ³Ρ€Π°Π½ΠΈΡ‡Π΅Π½ΠΈΠ΅ Π½Π° столбСц UnitsInStock, ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ΅ Π½Π΅ позволяСт Π·Π½Π°Ρ‡Π΅Π½ΠΈΡŽ ΡΡ‚Π°Π½ΠΎΠ²ΠΈΡ‚ΡŒΡΡ мСньшС нуля. Π­Ρ‚ΠΎ ΠΎΠ·Π½Π°Ρ‡Π°Π΅Ρ‚, Ρ‡Ρ‚ΠΎ ΠΌΠΎΠΆΠ½ΠΎ ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΈΡ‚ΡŒ, Π±ΡƒΠ΄Π΅Ρ‚ Π»ΠΈ транзакция ΠΎΡ‚ΠΌΠ΅Π½ΡΡ‚ΡŒΡΡ ΠΈΠ»ΠΈ Π½Π΅Ρ‚. НС Π΄ΠΎΠ»ΠΆΠ½ΠΎ Π±Ρ‹Ρ‚ΡŒ Π½ΠΈΠΊΠ°ΠΊΠΈΡ… ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌ с Π²Ρ‹Π·ΠΎΠ²ΠΎΠΌ IncreaseStock(), поэтому ΠΌΠΎΠΆΠ½ΠΎ ΡƒΠ²ΠΈΠ΄Π΅Ρ‚ΡŒ, Ρ‡Ρ‚ΠΎ транзакция Π±Ρ‹Π»Π° ΠΎΡ‚ΠΌΠ΅Π½Π΅Π½Π°, провСряя Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ столбца UnitsOnOrder для ProductID=5.

Π’ Π±Π»ΠΎΠΊΠ΅ try, Ссли всС ΠΈΠ΄Π΅Ρ‚ Ρ…ΠΎΡ€ΠΎΡˆΠΎ, ΠΈΠ»ΠΈ, Π΄Ρ€ΡƒΠ³ΠΈΠΌΠΈ словами, Ссли ΠΏΠΎΡ‚ΠΎΠΊ выполнСния Π΄ΠΎΠ»ΠΆΠ΅Π½ ΠΏΠΎΠΊΠΈΠ½ΡƒΡ‚ΡŒ PlaceOrder() Π½ΠΎΡ€ΠΌΠ°Π»ΡŒΠ½ΠΎ, Ρ‡Π΅Ρ€Π΅Π· return true, инструкция PlaceOrder() Π²Ρ‹Π·Ρ‹Π²Π°Π΅Ρ‚ ΠΌΠ΅Ρ‚ΠΎΠ΄ SetComplete() ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π° ContextUtil, эффСктивно сообщая DTC Ρ‡Π΅Ρ€Π΅Π· ΠΌΠ΅Π½Π΅Π΄ΠΆΠ΅Ρ€ рСсурсов, Ρ‡Ρ‚ΠΎ Π² Ρ‚ΠΎΠΉ части, которая касаСтся Π΅Π³ΠΎ, Ρ‚Ρ€Π°Π½Π·Π°ΠΊΡ†ΠΈΡŽ Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ Π·Π°Ρ„ΠΈΠΊΡΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ.