Aracılığıyla paylaş


Nasıl Yapılır: Örnek Denetimi Sağlayıcısı Geliştirme

Aşağıdaki yordamda, özel örnek denetimi sağlayıcısı oluşturma adımları verilmektedir.

  1. Sınıf Kitaplığı projesi oluşturun.

  2. Microsoft.ApplicationServer.StoreManagement'a bir başvuru ekleyin. Ayrıca, bu konudaki örnek kodu derlemek için System.Configuration derlemesine bir başvuru ekleyin.

  3. Kaynak dosyasının başlangıcına aşağıdaki deyimi ekleyin.

    using Microsoft.ApplicationServer.StoreManagement.Control;
    using Microsoft.ApplicationServer.StoreManagement.Control;
    using System.Data.SqlClient;
    using System.Collections.Specialized;
    using System.Threading;
    using System.Data;
    
  4. InstanceControlProvider sınıfından türeterek örnek denetimi sağlayıcısı için bir sınıf oluşturun.

        public class MySqlInstanceControlProvider : InstanceControlProvider
        {
        }
    
  5. Initialize yöntemini uygulayın. Bu yöntem, yapılandırma dosyasında belirtilen yapılandırma bilgilerine karşılık gelen bir özellik paketini kabul eder. Bu özellik paketindeki veriler sağlayıcıyı oluşturmada kullanılır. CreateInstanceControl veya UniqueProviderIdentifier yöntemi çağrılmadan önce Initialize yöntemi çağrılır.

    Not

    Uzaktan iletişim senaryolarında, ad-değer koleksiyonu “EnableServiceModelMetadata” adlı bir öğe içerir. Sağlayıcı base.Initialize yöntemini çalıştırmadan önce bu parametreyi yok saymayı veya kaldırmayı seçebilir. Bu özellik genellikle Microsoft.Web.Administration.ServerManager nesnesinde SetMetadata(“ServiceModel”, true) yönteminin çalıştırılıp çalıştırılmayacağını belirlemek için kullanılır.

    
            string ConnectionString { get; set; }
    
            public override void Initialize(string name, NameValueCollection config)
            {
    
                this.ConnectionString = config["connectionString"];
    
                // Initialize the base class
                base.Initialize(name, config);
            }
    
  6. Kullanıcının CommandSend nesnesine veya CommandReceive nesnesine erişmek için kullanacağı özel bir InstanceControl nesnesi döndürmek için InstanceControlProvider sınıfının CreateInstanceControl yöntemini uygulayın.

            public override InstanceControl CreateInstanceControl()
            {
                SqlConnectionStringBuilder connectionStringBuilder = new SqlConnectionStringBuilder(this.ConnectionString);
                connectionStringBuilder.AsynchronousProcessing = true;
                return new MySqlInstanceControl(connectionStringBuilder.ConnectionString);
            }
    

    Not

    MySqlInstanceControl türünün uygulaması için sonraki bölüme bakın.

  7. UniqueProviderIdentifier yöntemini uygulayın. Bu yöntemin döndürdüğü benzersiz sağlayıcı kimliği, farklı sağlayıcı nesnelerinin aynı temel alınan depoya çözümlenip çözümlenmediğini belirlemek için kullanılır.

            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 = System.Data.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();
                    }
                }
            }
    

InstanceControl'ü Uygulama

Aşağıdaki yordamda, özel InstanceControl türünü oluşturma adımları verilmektedir.

  1. InstanceControl sınıfından türeterek bir sınıf oluşturun.

        public class MySqlInstanceControl : InstanceControl
        {
            readonly string connectionString;
             public MySqlInstanceControl(string connectionString)
             {
                 this.connectionString = connectionString;
             }
        }
    
  2. CommandReceive özelliğini uygulayın. CommandReceive özelliğinin Get erişimci yöntemi CommandReceive nesnesini döndürmelidir. İstemci, komut sırasından zaman uyumsuz olarak komutlar almak için bu nesnedeki yöntemleri çağırır.

            MySqlCommandReceive commandReceive;
            public override CommandReceive CommandReceive
            {
                get 
                {
                    if (this.commandReceive == null)
                    {
                        MySqlCommandReceive tmp = new MySqlCommandReceive(this.connectionString);
                        Interlocked.CompareExchange(ref this.commandReceive, tmp, null);
                    }
                    return this.commandReceive;
                }
            }
    
  3. CommandSend özelliğini uygulayın ve Get erişimci yönteminden özel bir CommandSend nesnesi döndürün. CommandSend özelliğinin Get yöntemi CommandSend nesnesini döndürmelidir. İstemci, komut sırasına zaman uyumsuz olarak komutlar göndermek için bu nesnenin yöntemlerini çağırır.

            MySqlCommandSend commandSend;
            public override CommandSend CommandSend
            {
                get
                {
                    if (this.commandSend == null)
                    {
                        MySqlCommandSend tmp = new MySqlCommandSend(this.connectionString);
                        Interlocked.CompareExchange(ref this.commandSend, tmp, null);
                        return this.commandSend;
                    }
                    return this.CommandSend;
                }
            }
    

    İstemci komut sırasına komutlar göndermek (sıraya almak) ve komut sırasından komutlar almak (sıradan çıkarmak) için bu iki nesneyi kullanır. Örneğin, bir örnek denetimi cmdlet'i CommandSend nesnesini kullanarak bir komutu komut sırasına alır ve İş Akışı Yönetimi Hizmeti (WMS) CommandReceive nesnesini kullanarak o komutu komut sırasından çıkarır. Remove-ASAppServiceInstance cmdlet'inin yürütülmesi gibi bazı durumlarda, örneği örnek deposundan kaldırmak için komutu deponun kendisi işler.

    Not

    MySqlCommandSend ve MySqlCommandReceive türlerinin uygulamaları için aşağıdaki bölümlere bakın.

CommandSend'i Uygulama

Özel bir CommandSend türü oluşturmak için:

  • CommandSend sınıfından türeyen bir sınıf oluşturup BeginTrySend ve EndTrySend yöntemlerini uygulayın.

        public class MySqlCommandSend : CommandSend
        {
            readonly string connectionString;
    
            public MySqlCommandSend(string connectionString)
            {
                this.connectionString = connectionString;
            }
    
            public override IAsyncResult BeginSend(InstanceCommand command, TimeSpan timeout, AsyncCallback callback, object state)
            {
                throw new NotImplementedException();
            }
    
            public override void EndSend(IAsyncResult result)
            {
                throw new NotImplementedException();
            }
        }
    

CommandReceive'i Uygulama

Özel bir CommandReceive türü oluşturmak için:

  • CommandReceive sınıfından türeyen bir sınıf oluşturup BeginTryReceive ve EndTryReceive yöntemlerini uygulayın.

        public class MySqlCommandReceive : CommandReceive
        {
            readonly string connectionString;
    
            Queue<MySqlReceivedInstanceCommand> receivedInstanceCommands;
    
            public MySqlCommandReceive(string connectionString)
            {
                this.connectionString = connectionString;
                this.receivedInstanceCommands = new Queue<MySqlReceivedInstanceCommand>();          
            }
    
            public override IAsyncResult BeginTryReceive(TimeSpan timeout, AsyncCallback callback, object state)
            {
                throw new NotImplementedException();
            }
    
            public override bool EndTryReceive(IAsyncResult result, out ReceivedInstanceCommand command)
            {
                throw new NotImplementedException();
            }
        }
    

    Not

    MySqlReceivedInstanceCommand sınıfının uygulaması için aşağıdaki bölüme bakın.

ReceivedInstanceCommand'i Uygulama

Özel bir ReceivedInstanceCommand türü oluşturmak için:

  • ReceivedInstanceCommand sınıfından türeterek bir sınıf oluşturun ve InstanceCommandContext özelliğini uygulayın.

        class MySqlReceivedInstanceCommand : ReceivedInstanceCommand
        {
            long commandId;
            MySqlCommandReceive receiver;
            MySqlInstanceCommandContext context;
    
            internal MySqlReceivedInstanceCommand(long commandId,
                 Guid instanceId, Microsoft.ApplicationServer.StoreManagement.Control.CommandType commandType, IDictionary<string, string> serviceIdentifier, TimeSpan timeout,
                MySqlCommandReceive receiver) : base()
            {
                this.commandId = commandId;
                base.CommandType = commandType;
                base.InstanceId = instanceId;
                base.ServiceIdentifier = serviceIdentifier;
                //this.CommandTimeout = new TimeoutHelper(timeout, true);
                this.receiver = receiver;
                this.context = new MySqlInstanceCommandContext(this);
            }
            public override InstanceCommandContext InstanceCommandContext
            {
                get
                {
                    return this.context;
                }
            }
        }
    

    Not

    MySqlInstanceCommandContext türünün uygulaması için aşağıdaki bölüme bakın.

InstanceCommandContext'i Uygulama

Özel bir InstanceCommandContext türü oluşturmak için:

  • InstanceCommandContext sınıfından türeterek bir sınıf oluşturun ve BeginComplete, EndComplete, BeginAbandon ve EndAbandon yöntemlerini uygulayın.

    İstemci, komut yürütme işleminin başarılı olduğunu bildirmek için InstanceCommandContext nesnesinde BeginComplete yöntemini çağırır. Denetim sağlayıcısının bu komutu daha sonra komut sırasından çıkarması gerekir. Komutun yürütülmesi başarılı olursa, WMS bu yöntemi çağırır.

    İstemci, komut yürütme işleminin başarısız olduğunu bildirmek için InstanceCommandContext nesnesinde BeginAbandon yöntemini çağırır. Komut ile ne yapılacağına karar vermek örnek denetimi sağlayıcısına kalmıştır. Örneğin, denetim sağlayıcısı komutu komut sırasından kaldırmadan önce belirli sayıda yeniden deneyebilir. Komutun yürütülmesi başarısız olursa, WMS bu yöntemi çağırır.

        class MySqlInstanceCommandContext : InstanceCommandContext
        {
            MySqlReceivedInstanceCommand command;
    
            internal MySqlInstanceCommandContext(MySqlReceivedInstanceCommand command)
            {
                this.command = command;
            }
    
            public override IAsyncResult BeginAbandon(Exception exception, TimeSpan timeout, AsyncCallback callback, object state)
            {
                throw new NotImplementedException();
            }
    
            public override IAsyncResult BeginComplete(TimeSpan timeout, AsyncCallback callback, object state)
            {
                throw new NotImplementedException();
            }
    
            public override void EndAbandon(IAsyncResult result)
            {
                throw new NotImplementedException();
            }
    
            public override void EndComplete(IAsyncResult result)
            {
                throw new NotImplementedException();
            }
        }
    

Ayrıca bkz.

Kavramlar

Nasıl Yapılır: Örnek Deposu Sağlayıcısı Geliştirme
Nasıl Yapılır: Örnek Sorgusu Sağlayıcısı Geliştirme
Nasıl Yapılır: Örnek Deposu, Sorgu ve Denetim Sağlayıcıları Yapılandırma
Örnek Deposu, Sorgu ve Denetim Sağlayıcıları

  2011-12-05