Powershell singleton and $this behavior



我正处于一次重大重构和PS OOP教育的阵痛中,目前的主题是单身汉。我有一些程序状态数据,我想在单例中提供,我看到了一些奇怪的行为。

这适用于前两个Write Lines,但随后挂起了引用第二个类的第三个。

class PxStatus {
static [PxStatus] $singleton = $null
[string]$Context = 'machine'
[datetime]$StartTime = (Get-Date)
static [PxStatus] Get() {
if ([PxStatus]::singleton -eq $null) {
[PxStatus]::singleton = [PxStatus]::new()
}
return [PxStatus]::singleton
}
}
class pxLogFile {
# Properties
static [pxLogFile] $singleton = $null
[string] $nameSeed = "PxTools $(([PxStatus]::Get()).Context) context"
[string] $path = "$env:TEMP$(([pxLogFile]::Get()).nameSeed) $((get-date).toString('yyyy-MM-dd-hh-mm-ss')).log"
static [pxLogFile] Get() {
if ([pxLogFile]::singleton -eq $null) {
[pxLogFile]::singleton = [pxLogFile]::new()
return [pxLogFile]::singleton
}
}

CLS
Write-Host "$(([PxStatus]::Get()).Context)"
Write-Host "$(([PxStatus]::Get()).StartTime)"
Write-Host "$(([pxLogFile]::Get()).path)"

但是,如果我像这样在构造函数中寻址路径,它就可以工作了。

class PxStatus {
static [PxStatus] $singleton = $null
[string]$Context = 'machine'
[datetime]$StartTime = (Get-Date)
static [PxStatus] Get() {
if ([PxStatus]::singleton -eq $null) {
[PxStatus]::singleton = [PxStatus]::new()
#([PxStatus]::singleton).Context = 'machine'
#([PxStatus]::singleton).StartTime = Get-Date
}
return [PxStatus]::singleton
}
}
class pxLogFile {
# Properties
static [pxLogFile] $singleton = $null
[string] $nameSeed = "PxTools $(([PxStatus]::Get()).Context) context"
[string] $path = $null
static [pxLogFile] Get() {
if ([pxLogFile]::singleton -eq $null) {
[pxLogFile]::singleton = [pxLogFile]::new()
([pxLogFile]::singleton).Path = "$env:TEMP$(([pxLogFile]::Get()).nameSeed) $((get-date).toString('yyyy-MM-dd-hh-mm-ss')).log"
}
return [pxLogFile]::singleton
}
}

CLS
Write-Host "$(([PxStatus]::Get()).Context)"
Write-Host "$(([PxStatus]::Get()).StartTime)"
Write-Host "$(([pxLogFile]::Get()).path)

我认为问题在于访问同一个singleton中的属性,就像我对nameSeed所做的那样。或者,我也可以在属性定义中使用它。

[string] $path = "$env:TEMP$($this.nameSeed) $((get-date).toString('yyyy-MM-dd-hh-mm-ss')).log"

老实说,这本书更可读。我只是想知道导致失败的第一个究竟发生了什么?我不使用$this是不是在创造某种奇怪的循环条件?

嵌套在中的[pxLogFile]::Get()调用

[string] $path = "$env:TEMP$(([pxLogFile]::Get()).nameSeed) $((get-date).toString('yyyy-MM-dd-hh-mm-ss')).log"

导致无限递归,最终导致堆栈溢出。

在初始化$path:时,只需直接引用另一个静态属性$nameSeed

class pxLogFile {
# Properties
static [pxLogFile] $singleton = $null
[string] $nameSeed = "PxTools $(([PxStatus]::Get()).Context) context"
# Refer to $nameSeed instead of to [pxLogFile]::Get()).nameSeed
[string] $path = "$env:TEMP$($nameSeed) $((get-date).toString('yyyy-MM-dd-hh-mm-ss')).log"
static [pxLogFile] Get() {
if ($null -eq [pxLogFile]::singleton) {
[pxLogFile]::singleton = [pxLogFile]::new()
}
return [pxLogFile]::singleton
}
}

相关内容

最新更新