は別々のクラス内のロジックを抽出し、それを直接呼び出す:は今、あなたはInvoke()
方法でそれを実行(および出力を収集する)ことができます。コマンドレットを使用して、この新しいクラスを囲む単なるシェルにすることができます。 この問題の分離(SoC)により、ユニットテストが容易になり、よりクリーンなアーキテクチャが実現します。
抽出されたクラスGreeter.cs
public class Greeter {
public Greeter(string name) {
_Name = name;
}
private string _Name;
public string SayHello() {
return $"Hello {_Name}";
}
public string SayGoodBye() {
return $"So long {_Name}, and thanks for all the fish!";
}
}
コマンドレットGetGreetingCommand.cs
[Cmdlet("Greeting", "Get")]
public class GetGreetingCommand : Cmdlet {
[Parameter(Mandatory = true)]
public string Name { get; set; }
protected override void ProcessRecord() {
var greeter = new Greeter(Name);
var greeting = greeter.SayHello();
WriteObject(greeting);
}
}
コマンドレットGetGoodByeCommandは.cs
[Cmdlet("GoodBye", "Get")]
public class GetGoodByeCommand : Cmdlet {
[Parameter(Mandatory = true)]
public string Name { get; set; }
protected override void ProcessRecord() {
var greeter = new Greeter(Name);
var goodBye = greeter.SayGoodBye();
WriteObject(goodBye);
}
}
コンソールMain.cs(またはグリータークラスの他のクライアント・コード)
public static void main(string[] args) {
var greeter = new Greeter(args.FirstOrDefault());
Console.WriteLine(greeter.SayHello());
Console.WriteLine(greeter.SayGoodBye());
}
のTestCase
public static void SayingHelloUsesName() {
var sut = new Greeter("Arthur");
var expected = "Hello Arthur";
var actual = sut.SayHello();
Assert.AreEqual(expected, actual);
}
ここ2つの懸念are - t実際のBusinessLogic(Greeter.cs) - PowerShellとの相互運用性、コマンドレットをパラメータ化するメカニズムの提供など(Get * Command.cs)。ご覧のように、コマンドレットは実際には呼び出しを通過するだけで、PowerShell経由での使用も可能です。
@Mathias R. Jessenの答えは、サードパーティのコマンドレットを呼び出す必要がある場合に便利ですが、ほとんどの場合、実行しようとしているものに対して適切な(非PowerShellの)APIが必要です。
正確な問題は何ですか?それを呼び出す方法は? –
はい、そのWriteObjectメソッドから読み取る –