Как создать реальные объекты с поведением (методами) в PowerShell?
вероятно, на этот вопрос уже был дан ответ.... но я не нашел конкретного ответа на мои потребности.
кстати, я использую PowerShell 3
Ну, я новичок в PowerShell, но у меня много опыта в качестве разработчика C#, поэтому работа с объектами очень важна для меня.
поэтому мне интересно, есть ли чисто применить концепции ООП (ну, не все из них, хотя это было бы потрясающе) в сценарии PowerShell, для например, есть конкретные вещи, которые я хотел бы сделать.
примечание: Я знаю, что я могу написать код C# в PowerShell для создания DTO, а также что я могу создавать двоичные модули PowerShell в C#, я делал это в прошлом, но то, что я ищу сейчас, - это возможность написать весь мой код в PowerShell, но в объектно-ориентированный путь.
вещи, которые я хотел бы сделать:
-
создайте объект в PowerShell и предоставьте функцию, написанную в PowerShell, а также что-то вроде этого:
function New-Person ( [Parameter()][string]$firstName ) { function Walk() { Write-Host "Walking..."; } $person = New-Object psobject; $person | Add-Member -MemberType NoteProperty -Name FirstName -Value $firstName; #This line does not work #$person | Add-Member -MemberType CodeMethod -Name Walk -Value Walk; return $person; } $MyPerson = New-Person -firstName "JP"; $MyPerson; #This line does not work $MyPerson.Walk();
инкапсулировать поведение, что означает создание функций внутри моего объекта, а затем пометить их как private
[приятно]. создайте базовые классы, чтобы я мог наследовать и специализировать методы переопределения поведения
[приятно]. создайте интерфейсы, чтобы я мог начать думать в модульном тестировании в изоляция моих методов PowerShell (я знаю, что есть такие инструменты, как Pester, чтобы сделать это, я просто фокусируюсь на функциях OOP)
что я сделал до сих пор составляет создание объектов только со свойствами (DTO) но я хотел бы добавить поведение к моим объектам
Я был бы признателен, если бы вы, ребята, указали мне в правильном направлении
3 ответов
два варианта создания объекта с помощью методов:
- Add-Member
- New-Module-AsCustomObject
примеры кода:
$person | Add-Member -MemberType ScriptMethod -Value {
'I do stuff!'
}
$person = New-Module -AsCustomObject -ScriptBlock {
$Property = 'value'
[string]$Other = 'Can be strongly typed'
function MyMethod {
'I do stuff!'
}
}
EDIT: говоря о частном / общественном... В последнем примере свойство не будет отображаться "по умолчанию". Вы можете решить, что такое public using Export-ModuleMember
и указать -Variable
(свойства) и/или -Function
(методы), которые будут общедоступными. Без явного Export-ModuleMember
он будет вести себя так же, как в "нормальной модуль" - экспорт только функции (методы).
Если вы хотите полное OOP (включая наследование, хотя и не интерфейсы), затем PSClass является лицензированной реализацией MS-PL.
PowerShell v5 предоставляет полную поддержку классов, что упрощает создание собственных классов со свойствами и методами реализации.
Проверьте большой пост Тревора в блоге о теме здесь. Тревор Салливан, реализующий класс .net