2011-08-09 44 views
6

我正在用C#編寫一個PowerShell提供程序。該提供程序通過類似驅動器的界面公開應用程序域對象。例如:在PowerShell Provider中,您何時刷新vs緩存數據?

my:\Users\[email protected] 
my:\Customers\Marty 

該數據最終來自數據庫。

我一直無法找到任何關於何時應該訪問數據庫以獲取數據以及何時應該緩存數據的重要指導。我發現PowerShell多次調用像ItemExists和GetChildNames這樣的方法;經常爲同一個命令重複。例如,僅僅因爲他們按Tab鍵進行自動完成,訪問數據庫5到6次是不切實際的。

但在同一時間,因爲在命令提示符下一個用戶,如果我輸入Get-ChildItemdir),看看名單,然後做一些PowerShell的外面,讓我知道數據被刷新,同時另一個目錄列表應該期待查看數據庫的任何更改。

我覺得如果我知道正確的術語來描述我的問題(用PowerShell的說法),我可以谷歌答案或找到現有的重複問題,但我卡住了。

+3

「軟件工程中存在兩個難題:命名,緩存失效和關閉一個錯誤。」 – Richard

回答

5

這與powershell以及與您的數據有關的所有事情很少有關係,以及刷新它的重要性。一個簡單的緩存方案是使用基於時間的系統,在N分鐘後,對後端數據層的請求將拉取新的副本並重置計時器。看起來你已經知道你的特定規則應該是什麼了。我不認爲兩個連續的「dir」命令總是會導致從後備存儲中拉出兩次,但您對您的系統確實如此。所以做到這一點。

UPDATE

也許一個簡單的指導原則可能是每一次命令提供商發出你應該只刷新您的數據。這對供應商的項目運營的內置命令的列表包括:

  • 清除-項目
  • 拷貝項目
  • GET-項目
  • 調用-項目
  • 布展項目
  • 新建項目
  • 刪除,項目
  • 重命名,項目
  • 設置 - 項目

此外,上提供項目運營性能由內置的命令列表:

  • 清除-ItemProperty
  • 複製,ItemProperty
  • 的Get- ItemProperty
  • Move-ItemProperty
  • New-ItemProperty
  • 刪除-ItemProperty
  • 重命名-ItemProperty
  • 的Set-ItemProperty

最後,讀/寫的內容,我們使用:

  • 添加內容
  • 清除內容
  • Get-Content
  • Set-Content

這些命令中的每一個都在NavigationCmdletProvider(用於分層數據存儲)中具有相應的方法,這是您可能需要刷新數據的位置。在實現New/Move/Rename/Remove/Set/Clear和其他數據更改方法時,您應該使用某種樂觀併發方法,因爲PowerShell中的提供者實例不是單例;隨時可能會有一個或多個實例在玩。

我寫了一個供應商,它需要從執行腳本,您可以在找到更容易原型的東西。見http://psprovider.codeplex.com/

希望這有助於。

+1

目前我正在使用基於時間的方法。但它感覺不舒服。當然,PowerShell中有一個合適的指示器,用於說明在執行一個命令時何時調用方法5次以及何時運行新命令或新管道的區別。 –

+0

提供另一個示例。如果有人編寫了一個.ps1腳本,其中包括與提供程序的一些交互以及影響數據庫的現有工具的執行,則可能會有幾次連續的提供程序操作,它們之間會有數毫秒的數據更改操作。建議那些人在他們的劇本中睡覺或延遲以適應我,似乎是不專業的。而且,在執行單個命令時多次調用這些方法時,轉到每個提供程序方法上的數據庫似乎也是錯誤的。我猜這是我正在努力解決的問題。 –

+0

好的,讓我給我的答案添加一些細節。 – x0n