В провайдере PowerShell, когда вы обновляете данные кэша?

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

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

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

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

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

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

1 ответ

Решение

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

ОБНОВИТЬ

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

  • Clear-Item
  • Copy-Item
  • Get-Item
  • Invoke-Item
  • Move-Item
  • New-Item
  • Удалить объект
  • Переименование-Item
  • Set-Item

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

  • Clear-ItemProperty
  • Copy-ItemProperty
  • Get-ItemProperty
  • Move-ItemProperty
  • New-ItemProperty
  • Remove-ItemProperty
  • Переименовать-ItemProperty
  • Set-ItemProperty

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

  • Добавить контент
  • Clear-Content
  • Get-Content
  • Set-Content

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

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

Надеюсь это поможет.

Другие вопросы по тегам