3. lépés: Összetevők újrafelhasználása
Célkitűzések
Ebben a lépésben a következőket fogja megtudni:
- Újrafelhasználható összetevők.
- Az újrahasználhatóság megtervezhetősége.
Leírás
A COM+ szolgáltatás alapozójának két korábbi része, 1. lépés: Tranzakciós összetevő létrehozása és 2. lépés: Tranzakció kiterjesztése több összetevőre bemutatja, hogyan írhat egy összetevőt, amely meghív egy második összetevőt, hogy segítse a munka elvégzését, és frissítse a szerzői adatokat a Microsoft SQL Server Pubs adatbázisban; minden munkát egyetlen tranzakció véd. A mintaösszetevők a szerző adatainak frissítésére és a szerző címének ellenőrzésére, valamint a COM+ által biztosított tranzakciófeldolgozásra, JIT-aktiválási, valamint egyidejűségi védelem.
Ez a lépés bemutatja, hogyan használhatóak újra az 1. és a 2. lépésben létrehozott összetevők, és megvizsgálja, hogy ez mit jelent ezeknek az összetevőknek a kialakításában. Az alábbi ábrán látható módon ez azt jelenti, hogy létrehoz egy új összetevőt, AddNewAuthor
, amely új szerzőket ad hozzá az adatbázishoz a UpdateAuthorAddress
meghívásával.
A meglévő összetevő funkcióinak újrafelhasználása mellett AddNewAuthor
meghív egy másik, ValidateAuthorName
nevű új összetevőt. Ahogy az előző ábrán látható, ValidateAuthorName
nem tranzakciós. Az összetevő tranzakcióattribútum-értéke az alapértelmezett beállításnál marad (Nem támogatott), hogy kizárja a munkáját a tranzakcióból. Ahogy a 3. lépés mintakódjában látható, ValidateAuthorName
írásvédett lekérdezéseket hajt végre az adatbázisban, és ennek a kisebb feladatnak a meghiúsulása nem okozhatja a tranzakció megszakításának lehetőségét. A AddNewAuthor
összetevő tranzakcióattribútum-értéke azonban Kötelező.
A AddNewAuthor
, UpdateAuthorAddress
és ValidateAuthorAddress
összetevők mind a tranzakcióban szavaznak. Ebben a tranzakcióban AddNewAuthor
a gyökérobjektum. A COM+ mindig a tranzakcióban létrehozott első objektumot hozza létre gyökérobjektumként.
Ebben a példában a UpdateAuthorAddress
összetevő újbóli használata egyszerű – a COM+ automatikusan biztosítja a várt szolgáltatásokat. Az eredmények azonban eltérőek lennének, ha a UpdateAuthorAddress
összetevő tranzakcióattribútum-értéke eredetileg Új igényel a Kötelezőhelyett. A felületen mindkét beállítás hasonlónak tűnik; mindkettő garantálja a tranzakciót.
Újigényel, azonban mindig új tranzakciót indít el, míg Kötelező csak akkor indít el új tranzakciót, ha az objektum hívója nem tranzakciós. Ebből látható, hogy mennyire fontos volt UpdateAuthorAddress
-t alaposan és megfontoltan konfigurálni. Ellenkező esetben előfordulhat, hogy a COM+ másképp értelmezte a szolgáltatáskérést, és nem egy, hanem két nem kapcsolódó tranzakciót generált, ahogyan az alábbi ábrán látható.
Jegyzet
Amikor újra felhasználja az összetevőket, győződjön meg arról, hogy a szolgáltatások úgy vannak konfigurálva, hogy támogassák a kívánt eredményt.
Mintakód
Az AddNewAuthor összetevő az új szerzők kötegbe adását hajtja végre, lehetővé téve, hogy az objektum aktív maradjon, amíg az ügyfél fel nem adja az objektumra mutató hivatkozását.
Option Explicit
'
' Purpose: This class is used for adding a new author.
'
' Notes: IMPT: This component implicitly assumes that it will
' always run in a transaction. Undefined results may
' otherwise occur.
'
' AddNewAuthor
'
Public Sub AddNewAuthor( _
ByVal strAuthorFirstName As String, _
ByVal strAuthorLastName As String, _
ByVal strPhone As String, _
ByVal strAddress As String, _
ByVal strCity As String, _
ByVal strState As String, _
ByVal strZip As String, _
ByVal boolContracted As Boolean)
' Handle any errors.
On Error GoTo UnexpectedError
' Verify component is in a transaction.
' The VerifyInTxn subroutine is described in Step 1.
VerifyInTxn
' Get our object context.
Dim objcontext As COMSVCSLib.ObjectContext
Set objcontext = GetObjectContext
' Get the IContextState object.
Dim contextstate As COMSVCSLib.IContextState
Set contextstate = objcontext
' Validate that the author is OK.
' The ValidateAuthorName function is described after this function.
Dim oValidateAuthName As Object
Dim bValidAuthor As Boolean
Set oValidateAuthName = CreateObject("ComplusPrimer.ValidateAuthorName")
bValidAuthor = oValidateAuthName.ValidateAuthorName( _
strAuthorFirstName, strAuthorLastName)
If Not bValidAuthor Then
Err.Raise 999999, "The AddNewAuthor component", _
"You tried to add an author on the banned list!"
End If
' Open the connection to the database.
Dim conn As ADODB.Connection
Set conn = CreateObject("ADODB.Connection")
' Specify the OLE DB provider.
conn.Provider = "SQLOLEDB"
' Connect using Windows Authentication.
Dim strProv As String
strProv = "Server=MyDBServer;Database=pubs;Trusted_Connection=yes"
' Open the database.
conn.Open strProv
' Tell the database to actually add the author; use empty strings
' for this part and rely on the UpdateAuthorAddress
' component to validate the address/phone/etc data.
' Default Contract flag is off.
Dim strUpdateString As String
strUpdateString = "insert into authors values(_
'789-65-1234'," & _
strAuthorLastName & ", " & _
strAuthorFirstName & ", " & _
"'(555) 555-5555', ', ', ', '98765', "
If boolContracted Then
strUpdateString = strUpdateString + "1)"
Else
strUpdateString = strUpdateString + "0)"
End If
conn.Execute strUpdateString
' Close the connection; this potentially allows
' another component in the same transaction to
' reuse the connection from the connection pool.
conn.Close
Set conn = Nothing
' Create the UpdateAuthorAddress component.
Dim oUpdateAuthAddr As Object
Set oUpdateAuthAddr = CreateObject("ComplusPrimer.UpdateAuthorAddress")
' The component throws an error if anything goes wrong.
oUpdateAuthAddr.UpdateAuthorAddress "", strPhone, _
strAddress, strCity, strState, strZip
Set oUpdateAuthAddr = Nothing
' Everything works--commit the transaction.
contextstate.SetMyTransactionVote TxCommit
' Design issue: Allow batch additions of new
' authors in one transaction, or should each new author be added
' in a single new transaction?
contextstate.SetDeactivateOnReturn False
Exit Sub
UnexpectedError:
' There's an error.
contextstate.SetMyTransactionVote TxAbort
contextstate.SetDeactivateOnReturn True
End Sub
A ValidateAuthorName
összetevő ellenőrzi a szerzők nevét, mielőtt AddNewAuthor
hozzáadja a nevet az adatbázishoz. Ez az összetevő hibát ad vissza a hívójának, ha valami váratlan történik.
Option Explicit
'
' Purpose: This class is used for validating authors before
' adding them to the database.
'
' Notes: This component doesn't need to be in a transaction because
' it is performing read-only queries on the database,
' especially since these queries are not overlapping with
' any updates of end-user data. If an unexpected error
' happens, let the error go back to the caller who
' needs to handle it.
'
Public Function ValidateAuthorName( _
ByVal strAuthorFirstName As String, _
ByVal strAuthorLastName As String _
) As Boolean
ValidateAuthorName = False
' Open the connection to the database.
Dim conn As ADODB.Connection
Set conn = CreateObject("ADODB.Connection")
' Specify the OLE DB provider.
conn.Provider = "SQLOLEDB"
' Connect using Windows Authentication.
Dim strProv As String
strProv = "Server=MyDBServer;Database=pubs;Trusted_Connection=yes"
' Open the database.
conn.Open strProv
' Suppose another hypothetical table has been added to the Pubs
' database, one that contains a list of banned authors.
Dim rs As ADODB.Recordset
Set rs = conn.Execute("select * from banned_authors")
' Loop through the banned-author list looking for the specified
' author.
While Not rs.EOF
If rs.Fields("FirstName") = strAuthorFirstName And _
rs.Fields("LastName") = strAuthorLastName Then
' This is a banned author.
conn.Close
Set conn = Nothing
Set rs = Nothing
Exit Function
End If
rs.MoveNext
Wend
' None of the added authors found in the banned list.
ValidateAuthorName = True
conn.Close
Set conn = Nothing
Set rs = Nothing
End Function
Összefoglalás
- Vannak olyan esetek, amikor nem szeretné, hogy egy összetevő szavazzon a tranzakcióban.
- A COM+ nem kényszeríti ki a JIT aktiválási vagy egyidejűségi védelmét a nem tranzakciós összetevőkre. Ezeket a szolgáltatásokat külön konfigurálhatja.
- A hívó összetevő konfigurációja befolyásolja, hogy a COM+ hogyan értelmezi a hívott összetevő szolgáltatáskéréseit.
Kapcsolódó témakörök