So wird es gemacht: Entwickeln eines Instanzabfrageanbieters

Das folgende Verfahren beschreibt Schritte zum Erstellen eines benutzerdefinierten Instanzabfrageanbieters.

  1. Erstellen Sie ein Klassenbibliotheksprojekt.

  2. Fügen Sie einen Verweis auf Microsoft.ApplicationServer.StoreManagement.dll, hinzu. Fügen Sie darüber hinaus Verweise auf System.Configuration.dll und System.Data.dll hinzu, um den in diesem Thema bereitgestellten Beispielcode zu kompilieren.

  3. Fügen Sie die folgende Anweisung am Anfang der Quelldatei hinzu.

    using Microsoft.ApplicationServer.StoreManagement.Query;
    using System.Collections.Specialized; 
    using System.Data;
    using System.Data.SqlClient;
    
  4. Erstellen Sie eine Klasse für den Abfrageanbieter, die aus der Klasse InstanceQueryProvider abgeleitet ist.

        public sealed class MySqlInstanceQueryProvider : InstanceQueryProvider
        {
        }
    
  5. Implementieren Sie die Initialize-Methode. Diese Methode akzeptiert einen Eigenschaftenbehälter, der den in der Konfigurationsdatei angegebenen Konfigurationsinformationen entspricht. Die in diesem Eigenschaftenbehälter vorhandenen Daten werden zur Konstruktion des Anbieters verwendet. Die Methode Initialize wird vor den Methoden CreateInstanceQuery und UniqueProviderIdentifier aufgerufen.

    Hinweis

    In Remoteszenarien würde die Name/Wert-Auflistung ein Element namens EnableServiceModelMetadata enthalten. Der Anbieter kann diesen Parameter wahlweise ignorieren oder entfernen, bevor er die Methode base.Initialize aufruft. Diese Eigenschaft wird normalerweise für die Ermittlung verwendet, ob SetMetadata("ServiceModel", true) für das Microsoft.Web.Administration.ServerManager-Objekt aufgerufen wird.

    
            string storeName;
            string ConnectionString { get; set; }
    
            public override void Initialize(string name, NameValueCollection config)
            {
    
                this.storeName = name;
                this.ConnectionString= config["connectionString"];
    
                // Initialize the base class
                base.Initialize(name, config);
            }
    
  6. Implementieren Sie die Methode CreateInstanceQuery der Klasse InstanceQueryProvider, um ein benutzerdefiniertes InstanceQuery-Objekt zurückzugeben.

            public override InstanceQuery CreateInstanceQuery()
            {
                SqlConnectionStringBuilder connectionStringBuilder = new SqlConnectionStringBuilder(this.ConnectionString);
                connectionStringBuilder.AsynchronousProcessing = true;
                return new MySqlInstanceQuery(this.storeName, connectionStringBuilder.ConnectionString);
            }
    

    Hinweis

    Weitere Informationen zur Implementierung des Typs MySqlInstanceQuery finden Sie im nächsten Abschnitt.

  7. Implementieren Sie die UniqueProviderIdentifier-Methode. Die eindeutige Anbieter-ID, die von dieser Methode zurückgegeben wird, wird zur Bestimmung verwendet, ob verschiedene Anbieterobjekte zum gleichen zugrundeliegenden Informationsspeicher aufgelöst werden.

            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 = 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();
                    }
                }
            }
    

Implementieren von „InstanceQuery“

Das folgende Verfahren beschreibt Schritte zum Erstellen eines benutzerdefinierten Typs InstanceQuery.

  1. Erstellen Sie eine Klasse, die aus der Klasse InstanceQuery abgeleitet ist.

        public sealed class MySqlInstanceQuery : InstanceQuery
        {
            string storeName;
            string connectionString;
    
            public MySqlInstanceQuery(string storeName, string connectionString)
            {
               this.storeName = storeName;
                this.connectionString = connectionString;
            }
        }
    
  2. Implementieren Sie die BeginExecuteQuery-Methode. Ein Client verwendet diese Methode, um eine Abfrage nach Instanzen auszuführen.

            public override IAsyncResult BeginExecuteQuery(InstanceQueryExecuteArgs args, TimeSpan timeout, AsyncCallback callback, object state)
            {
                //uncomment the following line to compile the project or implement the method
                //throw new NotImplementedException();
            }
    
  3. Implementieren Sie die EndExecuteQuery-Methode. Diese Methode sollte eine Auflistung von InstanceInfo-Objekten zurückgeben.

            public override IEnumerable<InstanceInfo> EndExecuteQuery(IAsyncResult result)
            {
                //uncomment the following line to compile the project or implement the method
                //throw new NotImplementedException();
            }
    
  4. Implementieren Sie die BeginExecuteCount-Methode. Ein Client verwendet diese Methode, um eine Abfrage nach einer Instanzanzahl auszuführen.

            public override IAsyncResult BeginExecuteCount(InstanceQueryArgs args, TimeSpan timeout, AsyncCallback callback, object state)
            {
                //uncomment the following line to compile the project or implement the method
                //throw new NotImplementedException();
            }
    
  5. Implementieren Sie die EndExecuteCount-Methode. Diese Methode sollte die Anzahl der Instanzen zurückgeben.

            public override int EndExecuteCount(IAsyncResult result)
            {
                //uncomment the following line to compile the project or implement the method
                //throw new NotImplementedException();
            }
    
  6. Implementieren Sie die BeginExecuteGroupCount-Methode. Ein Client verwendet diese Methode, um eine Abfrage nach der Anzahl gruppierter Instanzen für den Instanzspeicher auszuführen.

            public override IAsyncResult BeginExecuteGroupCount(InstanceQueryGroupArgs args, TimeSpan timeout, AsyncCallback callback, object state)
            {
                //uncomment the following line to compile the project or implement the method
                //throw new NotImplementedException();
            }
    
  7. Implementieren Sie die EndExecuteGroupCount-Methode. Diese Methode sollte eine Auflistung von GroupingResult-Objekten zurückgeben.

            public override IEnumerable<GroupingResult> EndExecuteGroupCount(IAsyncResult result)
            {
                //uncomment the following line to compile the project or implement the method
                //throw new NotImplementedException();
            }
    
  8. Implementieren Sie die Cancel-Methode. Ein Client ruft diese Methode aus, um den vorhandenen Vorgang abzubrechen.

            public override void Cancel(IAsyncResult result)
            {
                //uncomment the following line to compile the project or implement the method
                //throw new NotImplementedException();
            }
    

Siehe auch

Konzepte

So wird es gemacht: Entwickeln eines Instanzspeicheranbieters
So wird es gemacht: Entwickeln eines Instanzsteuerungsanbieters
So wird es gemacht: Konfigurieren von Instanzspeicher-, Instanzabfrage- und Instanzsteuerungsanbieter
Instanzspeicher-, Instanzabfrage- und Instanzsteuerungsanbieter

  2011-12-05