Procedura per: Sviluppare un provider di query di istanza

Di seguito viene riportata la procedura di creazione di un provider di query di istanza personalizzato.

  1. Creare un progetto Libreria di classi.

  2. Aggiungere un riferimento a Microsoft.ApplicationServer.StoreManagement.dll. Aggiungere, inoltre, riferimenti a System.Configuration.dll e System.Data.dll per compilare il codice di esempio fornito in questo argomento.

  3. Aggiungere l'istruzione seguente all'inizio del file di origine.

    using Microsoft.ApplicationServer.StoreManagement.Query;
    using System.Collections.Specialized; 
    using System.Data;
    using System.Data.SqlClient;
    
  4. Creare una classe derivante dalla classe InstanceQueryProvider per il provider di query di istanza.

        public sealed class MySqlInstanceQueryProvider : InstanceQueryProvider
        {
        }
    
  5. Implementare il metodo Initialize. Questo metodo accetta un contenitore delle proprietà che corrisponde alle informazioni di configurazione specificate nel file di configurazione. I dati presenti in tale contenitore delle proprietà vengono utilizzati per costruire il provider. Il metodo Initialize viene richiamato prima del metodo CreateInstanceQuery o UniqueProviderIdentifier.

    Nota

    Negli scenari remoti, la raccolta nome-valore contiene un elemento denominato “EnableServiceModelMetadata”. Il provider può scegliere di ignorare e rimuovere questo parametro prima di richiamare il metodo base.Initialize. Questa proprietà in genere viene utilizzata per determinare se richiamare SetMetadata(“ServiceModel”, true) sull'oggetto Microsoft.Web.Administration.ServerManager.

    
            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. Implementare il metodo CreateInstanceQuery della classe InstanceQueryProvider per restituire un oggetto InstanceQuery personalizzato.

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

    Nota

    Per informazioni sull'implementazione del tipo MySqlInstanceQuery, consultare la sezione successiva.

  7. Implementare il metodo UniqueProviderIdentifier. L'ID provider univoco restituito da questo metodo viene utilizzato per stabilire se diversi oggetti di provider si risolvono nello stesso archivio sottostante.

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

Implementazione di InstanceQuery

Di seguito viene riportata la procedura di creazione di un tipo InstanceQuerypersonalizzato.

  1. Creare una classe derivante dalla classe InstanceQuery.

        public sealed class MySqlInstanceQuery : InstanceQuery
        {
            string storeName;
            string connectionString;
    
            public MySqlInstanceQuery(string storeName, string connectionString)
            {
               this.storeName = storeName;
                this.connectionString = connectionString;
            }
        }
    
  2. Implementare il metodo BeginExecuteQuery. Un client utilizza questo metodo per le istanze.

            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. Implementare il metodo EndExecuteQuery. Questo metodo deve restituire una raccolta di oggetti InstanceInfo.

            public override IEnumerable<InstanceInfo> EndExecuteQuery(IAsyncResult result)
            {
                //uncomment the following line to compile the project or implement the method
                //throw new NotImplementedException();
            }
    
  4. Implementare il metodo BeginExecuteCount. Un client utilizza questo metodo per eseguire le query del numero di istanze.

            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. Implementare il metodo EndExecuteCount. Questo metodo deve restituire un numero di istanze.

            public override int EndExecuteCount(IAsyncResult result)
            {
                //uncomment the following line to compile the project or implement the method
                //throw new NotImplementedException();
            }
    
  6. Implementare il metodo BeginExecuteGroupCount. Un client utilizza questo metodo per eseguire le query del numero di istanze raggruppate rispetto all'archiviazione istanza.

            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. Implementare il metodo EndExecuteGroupCount. Questo metodo deve restituire una raccolta di oggetti GroupingResult.

            public override IEnumerable<GroupingResult> EndExecuteGroupCount(IAsyncResult result)
            {
                //uncomment the following line to compile the project or implement the method
                //throw new NotImplementedException();
            }
    
  8. Implementare il metodo Cancel. Un client richiama questo metodo per annullare l'operazione esistente.

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

Vedere anche

Concetti

Procedura per: Sviluppare un provider di archiviazione istanza
Procedura per: Sviluppare un provider di controllo di istanza
Procedura per: Configurare l'archivio di istanza, query e provider di controllo
Archivio di istanza, query e provider di controllo

  2011-12-05