В провайдере PowerShell, когда вы обновляете данные кэша? - PullRequest
6 голосов
/ 09 августа 2011

Я пишу поставщик PowerShell в C #. Поставщик предоставляет доступ к объектам домена приложения через интерфейс, похожий на диск. Например:

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

Эти данные в конечном итоге поступают из базы данных.

Мне не удалось найти какого-либо замечательного руководства, когда вам следует обращаться к базе данных за данными и когда вам следует их кэшировать. Я обнаружил, что PowerShell вызывает методы, такие как ItemExists и GetChildNames, много раз; часто неоднократно для одной и той же команды. Нецелесообразно обращаться к базе данных 5 или 6 раз только потому, что они нажимают Tab для автоматического заполнения, например.

Но в то же время, как пользователь в командной строке, если я наберу Get-ChildItem (dir) и увижу список, то сделаю что-то вне PowerShell, чтобы я знал, что данные обновляются, беря другой каталог листинг должен ожидать каких-либо изменений в базе данных.

Мне кажется, что если бы я знал правильный термин для описания моей проблемы (на языке PowerShell), я мог бы найти ответ в Google или найти существующий дублирующий вопрос, но я застрял.

1 Ответ

5 голосов
/ 09 августа 2011

Это очень мало связано с powershell и всем, что связано с вашими данными, и тем, насколько важно их обновить.Простая схема кэширования будет состоять в использовании системы, основанной на времени, при которой через N минут запрос к уровню данных вашего бэкэнда получит новую копию и сбросит таймер.Кажется, у вас уже есть представление о том, какими должны быть ваши конкретные правила.Я не думаю, что две последовательные команды «dir» всегда должны приводить к двум извлечениям из резервного хранилища, но вы так думаете для своей системы.Так сделай так.

ОБНОВЛЕНИЕ

Возможно, простой руководящий принцип может заключаться в том, что вы должны обновлять данные только один раз для каждой команды провайдера.Список встроенных команд, которые работают с элементами провайдера, состоит из:

  • Clear-Item
  • Copy-Item
  • Get-Item
  • Invoke-Item
  • Move-Item
  • New-Item
  • Remove-Item
  • Rename-Item
  • Set-Item

Кроме того, список встроенных команд, работающих с элементом поставщика properties , состоит из:

  • Clear-ItemProperty
  • Copy-ItemProperty
  • Get-ItemProperty
  • Move-ItemProperty
  • New-ItemProperty
  • Remove-ItemProperty
  • Rename-ItemProperty
  • Set-ItemProperty

И, наконец, для чтения / записи контента мы используем:

  • Add-Content
  • Clear-Content
  • Get-Content
  • Set-Content

Каждая из этих команд имеет соответствующий метод в NavigationCmdletProvider (для иерархических хранилищ данных), и именно здесь вы можете захотеть перезапуститьсвежие ваши данные.При реализации методов New / Move / Rename / Remove / Set / Clear и других методов изменения данных следует использовать методологию оптимистичного параллелизма, поскольку экземпляры поставщика в PowerShell не являются единичными;в любой момент в игре может быть один или несколько экземпляров.

Я написал провайдера, который берет свою реализацию из сценария, в котором вам может быть проще создавать прототипы. См. http://psprovider.codeplex.com/

Надеждаэто помогает.

...