C#でPowerShellモジュールを使用していて、それが論理的に見えるものの、私の前提を確認または修正するための情報が見つかりません。 PowerShell Cmdletのデザインパターン
は、その後、私はパラメータとしてSomeCustomObjectを受け入れ、別のコマンドレットを持っていると言う、私は1コマンドレットは、この[Cmdlet(VerbsCommon.Get, CmdletHelpers.Noun, SupportsShouldProcess = true)]
[CmdletBinding]
public class GetSomething : PSCmdlet
{
protected override void ProcessRecord()
{
var SomeCustomObject = new SomeCustomClass()
WriteObject(SomeCustomObject);
}
}
のようになります持っていると言います。
[Cmdlet(VerbsData.Import, CmdletHelpers.Noun)]
[CmdletBinding]
public class ImportSomething : PSCmdlet
{
[Parameter(Mandatory = true, ValueFromPipeline = true)]
public SomeCustomClass SomeCustomObject { get; set; }
protected override void ProcessRecord()
{
// Do Something with SomeCustomObject
// Return modified SomeCustomObject
WriteObject(SomeCustomObject);
}
}
だから私は、特定のパラメータにとりPowerShellのコマンドレットは通常、パラメータを変更し、代わりに変更はそのパラメータになされる必要がある場合はコピーを作成するべきではないことを前提としています。しかし、私はこれについての決定的な意見を見つけることができません。言い換えれば
私はいくつかのPowerShellを呼び出す持っている場合、私は
protected override void ProcessRecord()
{
SomeCustomObject.ChangeSomething();
WriteObject(SomeCustomObject);
}
に上記の私のProcessRecordを変更した場合:
$SCO = Get-Something
$NewSCO = $SCO | Import-Something
$ NewSCOと$ SCOの両方がその同じ状態に変更されていたであろうつまり、パイプラインの上流にある項目の状態を保持して、後で元に戻したい場合は、元の値を保持していました(以前はCmdletを作成したCmdletのダウンストリームだった場合)。
代わりに(SomeCustomClassにはコピーコンストラクタがあると仮定します)、これはより良いデザインパターンになるはずです。
protected override void ProcessRecord()
{
var NewSomeCustomObject = new SomeCustomClass(SomeCustomObject);
NewSomeCustomObject.ChangeSomething();
WriteObject(NewSomeCustomObject);
}
私は完全にオフですか?
現在のCmdletの上流のパラメータオブジェクトを変更するために、パイプラインに納得の理由があることはありますか?