我有一个包装Mercurial命令行客户端的类库。如何创建一个可扩展的API,并仍然使用对象初始值设定语法?
我的意图是实现对所有内置命令的支持,但除此之外,还有很多扩展。
所以我需要让我的库可扩展,因为其他人和我都可以添加对扩展的支持。我计划增加对一些比较流行和典型的扩展的支持(至少是与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());
但是,我看到人们不喜欢通顺接口,他们觉得他们变得过于健谈。
我还有其他选择吗?
我想要什么,基本上是:
- 一个常见的语法风格
- 对于这两个内置的我的媒体库的用户添加的东西
- 除了扩展
我想我的图书馆的用户可以通过添加新的类和扩展方法来扩展它t intellisense支持,但扩展方法不能用于对象初始化器,这意味着所有的扩展看起来像是一些事后的想法。这不是我想要的。
欢迎任何想法。
是的,但不好意思,我的失误,我简化。我打算使用常规方法,以便使用库+扩展的程序员不必知道实际参数。 – 2010-12-05 18:21:48