Ich habe eine Klassenbibliothek, die den Befehlszeilenclient für Mercurial umschließt.Wie erstellt man eine erweiterbare API und verwendet weiterhin die Syntax der Objektinitialisierer?
Meine Absicht ist es, Unterstützung für alle eingebauten Befehle zu implementieren, aber zusätzlich zu diesen gibt es eine Tonne von Erweiterungen da draußen.
Also muss ich meine Bibliothek erweiterbar in dem Sinne, dass sowohl andere als auch ich Unterstützung für Erweiterungen hinzufügen können. Ich plane, Unterstützung für einige der populäreren und typischen Erweiterungen hinzuzufügen (zumindest einige von denen, die mit Mercurial geliefert werden), aber ich möchte immer noch in der Lage sein, es von außen zu erweitern.
Im Moment ist die Syntax eines Befehls dies wie folgt aussehen:
Repo.Execute(new CommitCommand
{
Message = "Your commit message",
AddRemove = true,
});
Dies ist jedoch selbst zu Erweiterungen, ohne den Programmierer sehr leicht ist das Gefühl nicht verleihen, dass die Verlängerung nur geheftet Teil.
Zum Beispiel nehmen wir an, ich eine öffentliche Sammlung von zusätzlichen Befehlszeilenargumente aussetzen, zu, dass ich manuell dies tun könnte:
var cmd = new CommitCommand
{
Message = "Your commit message",
AddRemove = true,
};
cmd.Arguments.Add("--my-commit-extension");
Repo.Execute(cmd);
Es scheint keine einfache Art und Weise zu sein, für mich, dass zusätzliche Erweiterung zu bekommen hinzugefügt so dass es als Teil des Objektinitialisierers gesetzt werden kann.
Ich habe darüber nachgedacht, eine fließende Schnittstellensyntax hinzuzufügen oder vielleicht zu wechseln. In diesem Fall könnten Sie so etwas schreiben:
Repo.Execute(new CommitCommand()
.Message("Your commit message")
.AddRemove()
.MyCommitExtension());
Allerdings sehe ich die Menschen nicht wie fließend Schnittstellen, sie fühlen sich zu gesprächig geworden.
Welche anderen Optionen habe ich?
Was ich will, im Grunde:
- Eine gemeinsame Syntax Stil
- Für beide Einbau in Sachen
- sowie Erweiterungen von Nutzern meiner Bibliothek hinzugefügt
Ich stelle mir vor, dass Benutzer meiner Bibliothek es erweitern würden, indem sie neue Klassen und Erweiterungsmethoden hinzufügen t Intellisense-Unterstützung, aber Erweiterungsmethoden können nicht in Objektinitialisierern verwendet werden, was bedeutet, dass alle Erweiterungen wie ein nachträglicher Einfall aussehen. Das ist nicht was ich will.
Alle Ideen sind willkommen.
Ja, aber sorry, mein Fehler, ich vereinfachte . Ich beabsichtige, normale Methoden zu haben, so dass der Programmierer, der die Bibliothek + die Erweiterungen verwendet, die tatsächlichen Argumente nicht kennen muss. –
Klingt wie eine gute Verwendung für die Dynamik. – Tergiver