提取逻辑在一个单独的类,并直接调用它。使用cmdlet就可以成为这个新课程的外壳。 这种关注点分离(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());
}
测试用例
public static void SayingHelloUsesName() {
var sut = new Greeter("Arthur");
var expected = "Hello Arthur";
var actual = sut.SayHello();
Assert.AreEqual(expected, actual);
}
的两个关注这里是 - 吨他的实际BusinessLogic(Greeter.cs) - 与PowerShell的互操作性,提供参数化cmdlet的机制等(Get * Command.cs)。如您所见,cmdlet只能通过调用,而通过PowerShell启用。
@Mathias R. Jessen的答案可能是有用的,如果您需要调用第三方cmdlet,但在大多数情况下,应该为您正在尝试执行的操作提供适当的(非PowerShell)API。
什么是确切的问题?如何调用它? –
是的,并从该WriteObject方法中读取 –