如何:开发实例查询提供程序

以下过程提供创建自定义实例查询提供程序的步骤。

  1. 创建一个 Class Library 项目。

  2. 向 Microsoft.ApplicationServer.StoreManagement.dll 添加引用。此外,向 System.Configuration.dll 和 System.Data.dll 添加引用以编译本主题中提供的示例代码。

  3. 在源文件的开头添加以下语句。

    using Microsoft.ApplicationServer.StoreManagement.Query;
    using System.Collections.Specialized; 
    using System.Data;
    using System.Data.SqlClient;
    
  4. 为从 InstanceStoreProvider 类派生的实例查询提供程序创建一个类。

        public sealed class MySqlInstanceQueryProvider : InstanceQueryProvider
        {
        }
    
  5. 实现 Initialize 方法。此方法接受与配置文件中指定的配置信息对应的属性包。在此属性包中的数据用于构造提供程序。在调用 CreateInstanceStoreUniqueProviderIdentifier 方法之前,调用 Initialize 方法。

    备注

    在远程方案中,名称/值集合包含名为“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 方法。此方法返回的唯一提供程序 ID 用于确定不同的提供程序对象是否解析为相同的基础存储。

            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