Инструкция по разработке поставщика запросов экземпляров

В следующей пошаговой процедуре приведены действия по созданию пользовательского поставщика запросов экземпляров.

  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. Этот метод принимает контейнер свойств, соответствующий данным, указанным в файле конфигурации. Данные в этом контейнере свойств используются для создания поставщика. Метод Initialize вызывается до метода CreateInstanceQuery или UniqueProviderIdentifier.

    Примечание

    В удаленных сценариях коллекция имя-значение будет содержать элемент EnableServiceModelMetadata. Поставщик может игнорировать или удалить этот параметр до вызова метода base.Initialize. Как правило, это свойство используется для определения, следует ли вызывать SetMetadata(“ServiceModel”, true) для объекта 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. Реализуйте метод CreateInstanceQuery класса InstanceQueryProvider для возвращения пользовательского объекта 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();
            }
    

См. также

Основные понятия

Инструкция по разработке поставщика хранилища экземпляров
Инструкция по разработке поставщика управления экземплярами
Инструкция по настройке поставщиков хранилищ экземпляров, запросов и управления
Поставщики хранилищ экземпляров, запросов и управления

  2011-12-05