У меня есть библиотека классов, которая упаковывает клиент командной строки для 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());
Однако я вижу, что людям не нравятся свободные интерфейсы, они чувствуют, что стали слишком болтливыми.
Какие еще есть варианты?
Что я хочу, в основном:
- Один общий стиль синтаксиса
- Для обеих встроенных вещей
- А также расширения, добавленные пользователями моей библиотеки
Я предполагаю, что пользователи моей библиотеки будут расширять ее, добавляя новые классы и методы расширения для получения поддержки intellisense, но методы расширения не могут использоваться в инициализаторах объектов, что означает, что все расширения выглядят как запоздалая мысль. Это не то, что я хочу.
Любые идеи приветствуются.