다음을 통해 공유


방법: 인스턴스 쿼리 공급자 개발

다음 절차에서는 사용자 지정 인스턴스 쿼리 공급자를 만들기 위한 단계를 제공합니다.

  1. 클래스 라이브러리 프로젝트를 만듭니다.

  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. InstanceQueryProvider 클래스에서 파생되는 인스턴스 쿼리 공급자에 대한 클래스를 만듭니다.

        public sealed class MySqlInstanceQueryProvider : InstanceQueryProvider
        {
        }
    
  5. Initialize 메서드를 구현합니다. 이 메서드는 구성 파일에 지정된 구성 정보에 해당하는 속성 모음을 적용합니다. 이 속성 모음의 데이터는 공급자를 구성하는 데 사용됩니다. CreateInstanceQuery 또는 UniqueProviderIdentifier 메서드를 호출하기 전에 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();
            }
    

참고 항목

개념

방법: 인스턴스 저장소 공급자 개발
방법: 인스턴스 컨트롤 공급자 개발
방법: 인스턴스 저장소, 쿼리 및 컨트롤 공급자 구성
인스턴스 저장소, 쿼리 및 제어 공급자

  2011-12-05