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

时间:2011-08-09 00:53:08

标签: powershell powershell-sdk powershell-provider

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

my:\Users\joe@blow.com
my:\Customers\Marty

此数据最终来自数据库。

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

但与此同时,作为命令提示符下的用户,如果我键入Get-ChildItemdir)并查看列表,请在PowerShell外部执行某些操作,以便我知道数据已刷新,获取另一个目录列表应该期望看到对数据库的任何更改。

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

1 个答案:

答案 0 :(得分:5)

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

<强>更新

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

  • 清除-项目
  • 拷贝项目
  • 获取-项目
  • 调用-项目
  • 将-项目
  • 新建项目
  • 移除-项目
  • 重命名 - 项目
  • 设置-项目

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

  • 清除-ItemProperty
  • 复制-ItemProperty
  • 获取-ItemProperty
  • 移动-ItemProperty
  • 新-ItemProperty
  • 移除-ItemProperty
  • 重新命名 - ItemProperty
  • 设置-ItemProperty

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

  • 附加内容
  • 清除-内容
  • 获取内容
  • 设置-内容

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

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

希望这有帮助。