В провайдере 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/
Надеюсь это поможет.