Condividi tramite


Esempio di componente servito

Nell'esempio seguente viene illustrato un componente servito composto da due parti, un client e un server. Nell'esempio, la derivazione della classe Account dalla classe ServicedComponent assicura che i contesti degli oggetti Account siano contenuti in COM+. Nell'esempio riportato sono applicati i seguenti attributi:

  • TransactionAttribute   Viene applicato alla classe Account per impostare la transazione su Required, che equivale ad impostare il supporto delle transazioni su un componente COM+ mediante lo strumento di amministrazione Servizi componenti, disponibile nel Pannello di controllo di Windows.
  • AutoCompleteAttribute   Viene applicato al metodo Post. Questo attributo indica al runtime di chiamare automaticamente la funzione SetAbort nella transazione se durante l'esecuzione del metodo viene generata un'eccezione non gestita. In caso contrario, il runtime chiama la funzione SetComplete.

Oltre agli attributi utilizzati in questo esempio, vengono utilizzati diversi attributi a livello di assembly per fornire informazioni sulla registrazione COM+. È necessario assegnare al componente servito un nome sicuro e collocarlo nella cache dell'assembly globale (GAC) per la registrazione manuale. Per ulteriori informazioni sugli assembly, vedere Assembly con nome sicuro.

Nota   Non è possibile utilizzare la registrazione dinamica per gli assembly collocati nella cache dell'assembly globale (GAC). Se si crea un'applicazione server, sarà necessario aggiungere alla GAC l'assembly e tutti gli assembly da cui esso dipende tramite Windows Installer prima di poter utilizzare l'applicazione server. In caso contrario, verrà generata un'eccezione.

Server BankComponent

Imports System.EnterpriseServices
Imports System.Runtime.CompilerServices
Imports System.Reflection

' Supply the COM+ application name. 
<assembly: ApplicationName("BankComponent")>
' Supply a strong-named assembly.
<assembly: AssemblyKeyFileAttribute("BankComponent.snk")>

Namespace BankComponent
      <Transaction(TransactionOption.Required)> _
      Public Class Account 
Inherits ServicedComponent
            <AutoComplete()> _
            Public Sub  Post(accountNum As Integer, amount As Double)
                  ' Updates the database; no need to call SetComplete.
                  ' Calls SetComplete automatically if no exception is generated.
            End Sub 
      End Class 
End Namespace 
[C#]
using System.EnterpriseServices;
using System.Runtime.CompilerServices;
using System.Reflection;

// Supply the COM+ application name.
[assembly: ApplicationName("BankComponent")]
// Supply a strong-named assembly.
[assembly: AssemblyKeyFileAttribute("BankComponent.snk")]

namespace BankComponent
{
      [Transaction(TransactionOption.Required)]
      public class Account : ServicedComponent
      {
            [AutoComplete] 
            public bool Post(int accountNum, double amount)
            {
                /* Updates the database; no need to call SetComplete.
                   Calls SetComplete automatically if no exception is
                   generated. */
            return false;     
            } 
      }
}

Client BankComponent

Imports BankComponent
Public Class Client 
   Shared Sub Main()
      Dim Account As New Account()
      ' Post money into the account. 
      Account.Post(5, 100)
   End Sub
End Class
[C#]
using BankComponent;
namespace BankComponentConsoleClient
{
      class Client
      {
            public static int Main() 
            {
                  try
                  {
                        Account act = new Account();
                        // Post money into the account.
                        act.Post(5, 100);
                        return(0);
                  }
                  catch
                  {
                        return(1);
                  }
            }
      }
}

Makefile.bat

È possibile compilare il client e il server nel modo illustrato di seguito.

sn –k BankComponent.snk
vbc /t:library /r:System.EnterpriseServices.dll Bank.vb
vbc /r:Bank.dll /r:System.EnterpriseServices.dll BankClient.vb
[C#]
sn –k BankComponent.snk
csc /t:library /r:System.EnterpriseServices.dll Bank.cs
csc /r:Bank.dll BankClient.cs

Vedere anche

Scrittura di componenti serviti | Cenni preliminari sui componenti serviti | Applicazione di attributi per la configurazione dei servizi | Registrazione dei componenti serviti | Riepilogo dei servizi COM+ disponibili | ServicedComponent | Spazio dei nomi System.EnterpriseServices