6

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

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

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

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

但同时,作为命令提示符下的用户,如果我键入Get-ChildItem( dir) 并查看列表,然后在 PowerShell 之外执行一些操作,以便我知道数据已刷新,获取另一个目录列表应该会看到对数据库。

我觉得如果我知道描述我的问题的正确术语(用 PowerShell 用语),我将能够通过谷歌搜索答案或找到现有的重复问题,但我被卡住了。

4

1 回答 1

5

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

更新

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

  • 清除项目
  • 复制项目
  • 获取项目
  • 调用项
  • 移动项目
  • 新物品
  • 除去项目
  • 重命名项目
  • 套装物品

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

  • Clear-ItemProperty
  • Copy-ItemProperty
  • 获取项目属性
  • 移动项属性
  • 新项目属性
  • 删除-ItemProperty
  • 重命名-ItemProperty
  • 设置项属性

最后,对于读/写内容,我们使用:

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

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

我编写了一个提供程序,它从脚本中获取其实现,您可能会发现在其中进行原型制作更容易。请参阅http://psprovider.codeplex.com/

希望这可以帮助。

于 2011-08-09T02:16:22.010 回答