在单独的类中提取逻辑并直接调用它。使用 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!";
}
}
CommandLet 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);
}
}
CommandLet 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(或 Greeter 类的任何其他客户端代码)
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 来满足您的要求。