共用方式為


作法:開發執行個體查詢提供者

下列程序提供建立自訂執行個體查詢提供者的步驟。

  1. 建立類別庫專案。

  2. 加入對 Microsoft.ApplicationServer.StoreManagement.dll 的參考。此外,也請加入對 System.Configuration.dll and System.Data.dll 的參考,以編譯此主題中提供的範例程式碼。

  3. 在來源檔案的開頭加入下列陳述式。

    using Microsoft.ApplicationServer.StoreManagement.Query;
    using System.Collections.Specialized; 
    using System.Data;
    using System.Data.SqlClient;
    
  4. 為執行個體查詢提供者建立衍生自 InstanceQueryProvider 類別的類別。

        public sealed class MySqlInstanceQueryProvider : InstanceQueryProvider
        {
        }
    
  5. 實作 Initialize 方法。此方法接受對應至組態檔中指定之組態資訊的屬性包。系統會使用此屬性包中的資料來建構提供者。Initialize 方法會在 CreateInstanceQueryUniqueProviderIdentifier 方法之前被呼叫。

    注意

    在遠端處理案例中,名稱-值集合會包含名為 “EnableServiceModelMetadata” 的項目。提供者可選擇在叫用 base.Initialize 方法之前忽略並移除此參數。此屬性通常是用來決定是否要叫用 Microsoft.Web.Administration.ServerManager 物件上的 SetMetadata(“ServiceModel”, true)。

    
            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. 實作 InstanceQueryProvider 類別的 CreateInstanceQuery 方法,以傳回自訂 InstanceQuery 物件。

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

    注意

    如需 MySqlInstanceQuery 類型實作的詳細資訊,請參閱下一節。

  7. 實作 UniqueProviderIdentifier 方法。系統會使用此方法傳回的唯一提供者識別碼,來決定是否要將不同的提供者物件解析為相同的基礎儲存區。

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

實作 InstanceQuery

下列程序提供建立自訂 InstanceQuery 類型的步驟。

  1. 建立衍生自 InstanceQuery 類別的類別。

        public sealed class MySqlInstanceQuery : InstanceQuery
        {
            string storeName;
            string connectionString;
    
            public MySqlInstanceQuery(string storeName, string connectionString)
            {
               this.storeName = storeName;
                this.connectionString = connectionString;
            }
        }
    
  2. 實作 BeginExecuteQuery 方法。用戶端會使用此方法來查詢執行個體。

            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. 實作 EndExecuteQuery 方法。此方法應該會傳回 InstanceInfo 物件的集合。

            public override IEnumerable<InstanceInfo> EndExecuteQuery(IAsyncResult result)
            {
                //uncomment the following line to compile the project or implement the method
                //throw new NotImplementedException();
            }
    
  4. 實作 BeginExecuteCount 方法。用戶端會使用此方法來查詢執行個體計數。

            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. 實作 EndExecuteCount 方法。此方法應該會傳回執行個體計數。

            public override int EndExecuteCount(IAsyncResult result)
            {
                //uncomment the following line to compile the project or implement the method
                //throw new NotImplementedException();
            }
    
  6. 實作 BeginExecuteGroupCount 方法。所有用戶端都會使用此方法來查詢執行個體儲存區的群組化執行個體計數。

            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. 實作 EndExecuteGroupCount 方法。此方法應該會傳回 GroupingResult 物件的集合。

            public override IEnumerable<GroupingResult> EndExecuteGroupCount(IAsyncResult result)
            {
                //uncomment the following line to compile the project or implement the method
                //throw new NotImplementedException();
            }
    
  8. 實作 Cancel 方法。用戶端會叫用此方法來取消現有的操作。

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

另請參閱

概念

作法:開發執行個體儲存提供者
作法:開發執行個體控制提供者
作法:設定執行個體儲存、查詢與控制提供者
執行個體儲存、查詢與控制提供者

  2012-03-05