在PowerShell提供程序中,何时刷新缓存数据?

Cra*_*ste 6 powershell powershell-sdk powershell-provider

我正在用C#编写PowerShell提供程序.提供程序通过类似驱动器的接口公开应用程序域对象.例如:

my:\Users\joe@blow.com
my:\Customers\Marty
Run Code Online (Sandbox Code Playgroud)

这些数据最终来自数据库.

我一直无法找到任何有关何时应该访问数据库以及何时应该缓存数据的指导.我发现PowerShell多次调用ItemExists和GetChildNames之类的方法; 经常反复为同一个命令.例如,仅仅因为他们点击Tab进行自动完成而去数据库5到6次是不切实际的.

但与此同时,作为命令提示符下的用户,如果我键入Get-ChildItem(dir)并查看列表,那么在PowerShell外部执行一些操作以便我知道数据已刷新,另一个目录列表应该会看到任何更改数据库.

我觉得,如果我知道用正确的术语来描述我的问题(用PowerShell的说法),我可以谷歌答案或找到一个现有的重复问题,但我卡住了.

x0n*_*x0n 5

这与powershell以及与数据有关的一切都很少,以及刷新它的重要性.一个简单的缓存方案是使用基于时间的系统,在N分钟后,对后端数据层的请求将拉出一个新的副本并重置计时器.您似乎已经知道您的特定规则应该是什么.我不认为两个连续的"dir"命令应该始终从后备存储中获得两次拉动,但您确实认为对于您的系统而言.所以就这样吧.

UPDATE

也许一个简单的指导原则可能是您应该只发出每个提供程序命令一次刷新数据.对提供者项目进行操作的内置命令列表包括:

  • 明确项目
  • 复制项目
  • GET-项目
  • 调用-项目
  • 布展项目
  • 新物品
  • 除去项目
  • 重新命名 - 项目
  • 设置项目

此外,对提供程序项属性进行操作的内置命令列表包括:

  • 清除-ItemProperty
  • 复制,ItemProperty
  • GET-ItemProperty
  • 移动-ItemProperty
  • 新-ItemProperty
  • 删除-ItemProperty
  • 重命名-ItemProperty
  • SET-ItemProperty

最后,为了阅读/写入内容,我们使用:

  • 添加内容
  • 清除内容
  • 获取内容
  • 设置内容

这些命令中的每一个都在NavigationCmdletProvider中具有相应的方法(用于分层数据存储),您可以在此处刷新数据.在实现New/Move/Rename/Remove/Set/Clear和其他数据更改方法时,您应该使用某种乐观并发方法,因为PowerShell中的提供程序实例不是单例; 任何时候都可能有一个或多个实例在场.

我写了一个提供程序,它从脚本中获取它的实现,你可能会发现它更容易原型化.请参阅http://psprovider.codeplex.com/

希望这可以帮助.