Sdílet prostřednictvím


Postupy: Vývoj zprostředkovatele řízení instancí

Následující postup obsahuje kroky k vytvoření vlastního zprostředkovatele řízení instancí.

  1. Vytvořte projekt knihovny tříd.

  2. Přidejte odkaz na knihovnu Microsoft.ApplicationServer.StoreManagement.dll. Dále přidejte odkaz na sestavení System.Configuration za účelem kompilace ukázky kódu v tomto tématu.

  3. Na začátek zdrojového souboru přidejte následující příkaz.

    using Microsoft.ApplicationServer.StoreManagement.Control;
    using Microsoft.ApplicationServer.StoreManagement.Control;
    using System.Data.SqlClient;
    using System.Collections.Specialized;
    using System.Threading;
    using System.Data;
    
  4. Odvozením od třídy InstanceControlProvider vytvořte třídu pro zprostředkovatele řízení instancí.

        public class MySqlInstanceControlProvider : InstanceControlProvider
        {
        }
    
  5. Implementujte metodu Initialize. Tato metoda přijímá balík vlastností, který odpovídá konfiguračním informacím zadaným v konfiguračním souboru. Data v tomto balíku vlastností se použijí k sestavení zprostředkovatele. Před voláním metody CreateInstanceControl nebo UniqueProviderIdentifier je volána metoda Initialize.

    Poznámka

    Pro vzdálené scénáře by kolekce název-hodnota obsahovala položku nazvanou EnableServiceModelMetadata. Zprostředkovatel se může před vyvoláním metody base.Initialize rozhodnout ignorovat a odebrat tento parametr. Tato vlastnost obvykle slouží k určení, zda vyvolat metodu SetMetadata(“ServiceModel”, true) u objektu Microsoft.Web.Administration.ServerManager.

    
            string ConnectionString { get; set; }
    
            public override void Initialize(string name, NameValueCollection config)
            {
    
                this.ConnectionString = config["connectionString"];
    
                // Initialize the base class
                base.Initialize(name, config);
            }
    
  6. Implementujte metodu CreateInstanceControl třídy InstanceControlProvider, aby byl vrácen vlastní objekt InstanceControl, který klient použije k přístupu k objektu CommandSend nebo CommandReceive.

            public override InstanceControl CreateInstanceControl()
            {
                SqlConnectionStringBuilder connectionStringBuilder = new SqlConnectionStringBuilder(this.ConnectionString);
                connectionStringBuilder.AsynchronousProcessing = true;
                return new MySqlInstanceControl(connectionStringBuilder.ConnectionString);
            }
    

    Poznámka

    Informace o implementaci typu MySqlInstanceControl naleznete v další části.

  7. Implementujte metodu UniqueProviderIdentifier. Na základě jedinečného ID zprostředkovatele vráceného touto metodou lze určit, zda různé objekty zprostředkovatelů po svém překladu odkazují na stejné základní úložiště.

            string UniqueStoreIdentifier { get; set; }
    
            public override string UniqueProviderIdentifier()
            {   
                this.UniqueStoreIdentifier = GetUniqueStoreIdentifier(this.ConnectionString); 
                return this.UniqueStoreIdentifier;
            }
    
            private string GetUniqueStoreIdentifier(string connectionString)
            {
                using (SqlConnection connection = new SqlConnection(connectionString))
                {
                    using (SqlCommand command = new SqlCommand())
                    {
                        command.CommandType = System.Data.CommandType.Text;
                        command.CommandText = "SELECT TOP (1) [StoreIdentifier] FROM [Microsoft.ApplicationServer.DurableInstancing].[StoreVersion]";
                        command.Connection = connection;
    
                        command.Connection.Open();
    
                        Guid identifier = (Guid)command.ExecuteScalar();
                        return identifier.ToString();
                    }
                }
            }
    

Implementace metody InstanceControl

Následující postup obsahuje kroky k vytvoření vlastního typu InstanceControl.

  1. Odvozením ze třídy InstanceControl vytvořte třídu.

        public class MySqlInstanceControl : InstanceControl
        {
            readonly string connectionString;
             public MySqlInstanceControl(string connectionString)
             {
                 this.connectionString = connectionString;
             }
        }
    
  2. Implementujte vlastnost CommandReceive. Metoda přístupu Get vlastnosti CommandReceive by měla vrátit objekt CommandReceive. Klient u tohoto objektu vyvolá metody pro asynchronní přijetí příkazů z fronty příkazů.

            MySqlCommandReceive commandReceive;
            public override CommandReceive CommandReceive
            {
                get 
                {
                    if (this.commandReceive == null)
                    {
                        MySqlCommandReceive tmp = new MySqlCommandReceive(this.connectionString);
                        Interlocked.CompareExchange(ref this.commandReceive, tmp, null);
                    }
                    return this.commandReceive;
                }
            }
    
  3. Implementujte vlastnost CommandSend a vraťte vlastní objekt CommandSend z metody přístupu Get. Metoda přístupu Get vlastnosti CommandSend by měla vrátit objekt CommandSend. Klient u tohoto objektu vyvolá metody pro asynchronní odeslání příkazů do fronty příkazů.

            MySqlCommandSend commandSend;
            public override CommandSend CommandSend
            {
                get
                {
                    if (this.commandSend == null)
                    {
                        MySqlCommandSend tmp = new MySqlCommandSend(this.connectionString);
                        Interlocked.CompareExchange(ref this.commandSend, tmp, null);
                        return this.commandSend;
                    }
                    return this.CommandSend;
                }
            }
    

    Klient používá tyto dva objekty k posílání odkazů do fronty příkazů (zařazování příkazů) a přijímání příkazů z fronty (vyřazení příkazu z fronty). Například rutina řízení instancí zařadí příkaz do fronty pomocí objektu CommandSend a služba Správa pracovního postupu (WMS) příkaz z fronty vyřadí pomocí objektu CommandReceive. Za jistých okolností, například když je spuštěna rutina Remove-ASAppServiceInstance, zpracuje úložiště příkaz samo, aby došlo k odebrání příslušné instance z úložiště instancí.

    Poznámka

    Informace o implementacích typů MySqlCommandSend a MySqlCommandReceive naleznete v následujících částech.

Implementace typu CommandSend

Vytvoření vlastního typu CommandSend:

  • Vytvořte třídu odvozením od třídy CommandSend a implementujte metody BeginTrySend a EndTrySend.

        public class MySqlCommandSend : CommandSend
        {
            readonly string connectionString;
    
            public MySqlCommandSend(string connectionString)
            {
                this.connectionString = connectionString;
            }
    
            public override IAsyncResult BeginSend(InstanceCommand command, TimeSpan timeout, AsyncCallback callback, object state)
            {
                throw new NotImplementedException();
            }
    
            public override void EndSend(IAsyncResult result)
            {
                throw new NotImplementedException();
            }
        }
    

Implementace typu CommandReceive

Vytvoření vlastního typu CommandReceive:

  • Vytvořte třídu odvozením od třídy CommandReceive a implementujte metody BeginTryReceive a EndTryReceive.

        public class MySqlCommandReceive : CommandReceive
        {
            readonly string connectionString;
    
            Queue<MySqlReceivedInstanceCommand> receivedInstanceCommands;
    
            public MySqlCommandReceive(string connectionString)
            {
                this.connectionString = connectionString;
                this.receivedInstanceCommands = new Queue<MySqlReceivedInstanceCommand>();          
            }
    
            public override IAsyncResult BeginTryReceive(TimeSpan timeout, AsyncCallback callback, object state)
            {
                throw new NotImplementedException();
            }
    
            public override bool EndTryReceive(IAsyncResult result, out ReceivedInstanceCommand command)
            {
                throw new NotImplementedException();
            }
        }
    

    Poznámka

    Informace o implementaci třídy MySqlReceivedInstanceCommand naleznete v další části.

Implementace třídy ReceivedInstanceCommand

Vytvoření vlastního typu ReceivedInstanceCommand:

  • Vytvořte třídu odvozením od třídy ReceivedInstanceCommand a implementujte vlastnost InstanceCommandContext.

        class MySqlReceivedInstanceCommand : ReceivedInstanceCommand
        {
            long commandId;
            MySqlCommandReceive receiver;
            MySqlInstanceCommandContext context;
    
            internal MySqlReceivedInstanceCommand(long commandId,
                 Guid instanceId, Microsoft.ApplicationServer.StoreManagement.Control.CommandType commandType, IDictionary<string, string> serviceIdentifier, TimeSpan timeout,
                MySqlCommandReceive receiver) : base()
            {
                this.commandId = commandId;
                base.CommandType = commandType;
                base.InstanceId = instanceId;
                base.ServiceIdentifier = serviceIdentifier;
                //this.CommandTimeout = new TimeoutHelper(timeout, true);
                this.receiver = receiver;
                this.context = new MySqlInstanceCommandContext(this);
            }
            public override InstanceCommandContext InstanceCommandContext
            {
                get
                {
                    return this.context;
                }
            }
        }
    

    Poznámka

    Informace o implementaci typu MySqlInstanceCommandContext naleznete v další části.

Implementace typu InstanceCommandContext

Vytvoření vlastního typu InstanceCommandContext:

  • Vytvořte třídu odvozením od třídy InstanceCommandContext a implementujte metody BeginComplete, EndComplete, BeginAbandon a EndAbandon.

    Klient vyvolá metodu BeginComplete u objektu InstanceCommandContext, aby bylo oznámeno, že se zdařilo spuštění příkazu. Potom by měl zprostředkovatel řízení odebrat příkaz z fronty příkazů. Správa pracovního postupu vyvolá tuto metodu tehdy, pokud je spuštění příkazu úspěšné.

    Klient vyvolá metodu BeginAbandon u objektu InstanceCommandContext, aby bylo oznámeno, že se nezdařilo spuštění příkazu. Je na zprostředkovateli řízení instancí, aby rozhodl, co s příkazem udělá. Zprostředkovatel řízení může například zkusit příkaz spustit znovu s určitým počtem opakování, než příkaz z fronty příkazů odebere. Správa pracovního postupu vyvolá tuto metodu tehdy, pokud není spuštění příkazu úspěšné.

        class MySqlInstanceCommandContext : InstanceCommandContext
        {
            MySqlReceivedInstanceCommand command;
    
            internal MySqlInstanceCommandContext(MySqlReceivedInstanceCommand command)
            {
                this.command = command;
            }
    
            public override IAsyncResult BeginAbandon(Exception exception, TimeSpan timeout, AsyncCallback callback, object state)
            {
                throw new NotImplementedException();
            }
    
            public override IAsyncResult BeginComplete(TimeSpan timeout, AsyncCallback callback, object state)
            {
                throw new NotImplementedException();
            }
    
            public override void EndAbandon(IAsyncResult result)
            {
                throw new NotImplementedException();
            }
    
            public override void EndComplete(IAsyncResult result)
            {
                throw new NotImplementedException();
            }
        }
    

Další odkazy

Koncepty

Postupy: Vývoj zprostředkovatele úložiště instancí
Postupy: Vývoj zprostředkovatele dotazů na instance
Postupy: Konfigurace zprostředkovatelů úložišť instancí, dotazů a řízení
Zprostředkovatelé úložiště instancí, dotazů a řízení

  2011-12-05