我有一个包含 Mercurial 命令行客户端的类库。
我的目的是实现对所有内置命令的支持,但除此之外,还有大量的扩展。
所以我需要使我的库可扩展,因为我和其他人都可以添加对扩展的支持。我计划添加对一些更流行和典型的扩展的支持(至少有不少与 Mercurial 捆绑在一起的),但我仍然希望能够从外部扩展它。
目前,命令的语法如下所示:
Repo.Execute(new CommitCommand
{
Message = "Your commit message",
AddRemove = true,
});
然而,这并不适合扩展,程序员不会觉得扩展只是一部分。
例如,假设我公开了一个公共的附加命令行参数集合,我可以手动执行此操作:
var cmd = new CommitCommand
{
Message = "Your commit message",
AddRemove = true,
};
cmd.Arguments.Add("--my-commit-extension");
Repo.Execute(cmd);
对我来说似乎没有简单的方法来添加额外的扩展,使其可以设置为对象初始化程序的一部分。
我一直在考虑添加或切换到流畅的界面语法。在这种情况下,您可以编写如下内容:
Repo.Execute(new CommitCommand()
.Message("Your commit message")
.AddRemove()
.MyCommitExtension());
但是,我看到人们不喜欢流畅的界面,他们觉得它们变得太健谈了。
我还有什么其他选择?
我想要的,基本上:
- 一种常见的语法风格
- 对于两个内置的东西
- 以及我的图书馆用户添加的扩展
我设想我的库的用户将通过添加新类和扩展方法来扩展它以获得智能感知支持,但扩展方法不能用于对象初始化程序,这意味着所有扩展看起来都是事后才想到的。那不是我想要的。
欢迎任何想法。