Bir öğe sağlayıcı yazma


Bu konu, veri deposundaki öğelere erişen ve bunları işleyen bir Windows PowerShell sağlayıcısının yöntemlerinin nasıl uygulanacağını açıklamaktadır. Öğelere erişebilmek için bir sağlayıcının System.Management.Automation.Provider.Itemcmdletprovider sınıfından türetmesi gerekir.

Bu konudaki örneklerdeki sağlayıcı, veri deposu olarak Access veritabanını kullanır. Veritabanıyla etkileşimde bulunmak için kullanılan çeşitli yardımcı yöntemler ve sınıflar vardır. Yardımcı yöntemleri içeren numunenin tamamı için bkz. AccessDBProviderSample03

Windows PowerShell sağlayıcıları hakkında daha fazla bilgi için bkz. Windows PowerShell Sağlayıcısına Genel Bakış.

Öğe yöntemlerini uygulama

System.Management.Automation.Provider.Itemcmdletprovider sınıfı, bir veri deposundaki öğelere erişmek ve bunları değiştirmek için kullanılabilecek çeşitli yöntemleri ortaya çıkarır. Bu yöntemlerin tam listesi için bkz. ItemCmdletProvider Yöntemleri. Bu örnekte bu yöntemlerden dördünü uygulayacağız. System.Management.Automation.Provider.Itemcmdletprovider.Getitem* belirtilen yolda bir öğe alır. System.Management.Automation.Provider.Itemcmdletprovider.Setitem* belirtilen öğenin değerini ayarlar. System.Management.Automation.Provider.Itemcmdletprovider.Itemexists* belirtilen yolda bir öğenin mevcut olup olmadığını denetler. System.Management.Automation.Provider.Itemcmdletprovider.Isvalidpath*, veri deposundaki bir konumla eşleşip eşleşmediğini görmek için bir yolu denetler.

Not

Bu konu, Windows PowerShell Sağlayıcısı Hızlı Başlangıç'taki bilgilere dayanmaktadır. Bu konu, bir sağlayıcı projesinin nasıl kurulacağına veya sürücüleri oluşturup kaldıran System.Management.Automation.Provider.Drivecmdletprovider sınıfından devralınan yöntemlerin nasıl uygulanacağına ilişkin temel bilgileri kapsamaz.

Sağlayıcı sınıfını bildirme

Sağlayıcının System.Management.Automation.Provider.Itemcmdletprovider sınıfından türeteceğini ve bunu System.Management.Automation.Provider.Cmdletprovide özelliğiyle süsleyeceğini bildirin.

[CmdletProvider("AccessDB", ProviderCapabilities.None)]

   public class AccessDBProvider : ItemCmdletProvider
   {

  }

GetItem'in Uygulanması

System.Management.Automation.Provider.Itemcmdletprovider.Getitem*, bir kullanıcı sağlayıcınızda Microsoft.PowerShell.Commands.GetItemCommand cmdlet'ini çağırdığında PowerShell motoru tarafından çağrılır. Yöntem, belirtilen yoldaki öğeyi döndürür. Access veritabanı örneğinde yöntem, öğenin sürücünün kendisi mi, veritabanındaki bir tablo mu yoksa veritabanındaki bir satır mı olduğunu denetler. Yöntem, System.Management.Automation.Provider.Cmdletprovider.Writeitemobject* yöntemini çağırarak öğeyi PowerShell motoruna gönderir.

protected override void GetItem(string path)
      {
          // check if the path represented is a drive
          if (PathIsDrive(path))
          {
              WriteItemObject(this.PSDriveInfo, path, true);
              return;
          }// if (PathIsDrive...

           // Get table name and row information from the path and do
           // necessary actions
           string tableName;
           int rowNumber;

           PathType type = GetNamesFromPath(path, out tableName, out rowNumber);

           if (type == PathType.Table)
           {
               DatabaseTableInfo table = GetTable(tableName);
               WriteItemObject(table, path, true);
           }
           else if (type == PathType.Row)
           {
               DatabaseRowInfo row = GetRow(tableName, rowNumber);
               WriteItemObject(row, path, false);
           }
           else
           {
               ThrowTerminatingInvalidPathException(path);
           }

       }

SetItem'in Uygulanması

System.Management.Automation.Provider.Itemcmdletprovider.Setitem* yöntemi, bir kullanıcı Microsoft.PowerShell.Commands.SetItemCommand cmdlet'ini çağırdığında PowerShell altyapısı çağrıları tarafından çağrılır. Belirtilen yoldaki öğenin değerini ayarlar.

Access veritabanı örneğinde, bir öğenin değerini yalnızca o öğe bir satırsa ayarlamak mantıklıdır; bu nedenle, öğe bir satır olmadığında yöntem NotSupportedException oluşturur.

protected override void SetItem(string path, object values)
       {
           // Get type, table name and row number from the path specified
           string tableName;
           int rowNumber;

           PathType type = GetNamesFromPath(path, out tableName, out rowNumber);

           if (type != PathType.Row)
           {
               WriteError(new ErrorRecord(new NotSupportedException(
                     "SetNotSupported"), "",
                  ErrorCategory.InvalidOperation, path));

               return;
           }

           // Get in-memory representation of table
           OdbcDataAdapter da = GetAdapterForTable(tableName);

           if (da == null)
           {
               return;
           }
           DataSet ds = GetDataSetForTable(da, tableName);
           DataTable table = GetDataTable(ds, tableName);

           if (rowNumber >= table.Rows.Count)
           {
               // The specified row number has to be available. If not
               // NewItem has to be used to add a new row
               throw new ArgumentException("Row specified is not available");
           } // if (rowNum...

           string[] colValues = (values as string).Split(',');

           // set the specified row
           DataRow row = table.Rows[rowNumber];

           for (int i = 0; i < colValues.Length; i++)
           {
               row[i] = colValues[i];
           }

           // Update the table
           if (ShouldProcess(path, "SetItem"))
           {
               da.Update(ds, tableName);
           }

       }

ItemExists'in Uygulanması

System.Management.Automation.Provider.Itemcmdletprovider.Itemexists* yöntemi, bir kullanıcı Microsoft.PowerShell.Commands.TestPathCommand cmdlet'ini çağırdığında PowerShell altyapısı tarafından çağrılır. Yöntem, belirtilen yolda bir öğe olup olmadığını belirler. Öğe mevcutsa, yöntem onu System.Management.Automation.Provider.Cmdletprovider.Writeitemobject* çağırarak PowerShell motoruna geri iletir.

protected override bool ItemExists(string path)
       {
           // check if the path represented is a drive
           if (PathIsDrive(path))
           {
               return true;
           }

           // Obtain type, table name and row number from path
           string tableName;
           int rowNumber;

           PathType type = GetNamesFromPath(path, out tableName, out rowNumber);

           DatabaseTableInfo table = GetTable(tableName);

           if (type == PathType.Table)
           {
               // if specified path represents a table then DatabaseTableInfo
               // object for the same should exist
               if (table != null)
               {
                   return true;
               }
           }
           else if (type == PathType.Row)
           {
               // if specified path represents a row then DatabaseTableInfo should
               // exist for the table and then specified row number must be within
               // the maximum row count in the table
               if (table != null && rowNumber < table.RowCount)
               {
                   return true;
               }
           }

           return false;

       }

IsValidPath'in uygulanması

System.Management.Automation.Provider.Itemcmdletprovider.Isvalidpath* yöntemi, belirtilen yolun geçerli sağlayıcı için sözdizimsel olarak geçerli olup olmadığını denetler. Yolda bir öğenin bulunup bulunmadığını kontrol etmez.

protected override bool IsValidPath(string path)
       {
           bool result = true;

           // check if the path is null or empty
           if (String.IsNullOrEmpty(path))
           {
               result = false;
           }

           // convert all separators in the path to a uniform one
           path = NormalizePath(path);

           // split the path into individual chunks
           string[] pathChunks = path.Split(pathSeparator.ToCharArray());

           foreach (string pathChunk in pathChunks)
           {
               if (pathChunk.Length == 0)
               {
                   result = false;
               }
           }
           return result;
       }

Sonraki adımlar

Tipik bir gerçek dünya sağlayıcısı, başka öğeler içeren öğeleri destekleyebilir ve öğeleri sürücü içinde bir yoldan diğerine taşıyabilir. Kapsayıcıları destekleyen bir sağlayıcı örneği için bkz. Kapsayıcı sağlayıcı yazma. Öğelerin taşınmasını destekleyen bir sağlayıcı örneği için bkz. Gezinme sağlayıcısı yazma.

Ayrıca Bakınız

Bir konteyner sağlayıcısı yazma

Gezinme sağlayıcısı yazma

Windows PowerShell Sağlayıcısına Genel Bakış

İlgili makaleler