2 Stimmen

Sicherstellen des schreibgeschützten Zugriffs auf die API-Rückgabewerte, wenn eine Plugin-Architektur vorhanden ist

Ich habe eine Situation, in der ich eine Plugin-Architektur in meiner Klassenbibliothek freigegeben habe, und ich möchte, dass andere die von mir erstellten Schnittstellen implementieren und ihre benutzerdefinierten Implementierungen von der Klasse verwenden können.

Ich verwende Dependency Injection (speziell Konstruktorinjektion), um dies zu erreichen.

Dies funktioniert gut, abgesehen davon, dass ich versucht habe, die Anwendung mit zwei sich widersprechenden Zielen zu entwerfen:

  • Die Benutzer der API sollten die Rückgabewerte nicht ändern können; Ich habe benutzerdefinierte schreibgeschützte Sammlungen und Objekte erstellt, indem ich internal auf die Setter und ähnliche verwendet habe, um sicherzustellen, dass keine Benutzer sie ändern können
  • Plugins in anderen Assemblys sollten auf diese internen Methoden und Eigenschaften zugreifen können

Diese beiden Ziele widersprechen sich, da es keine Möglichkeit gibt, dass meine API (oder C#) den Zugriff auf internal (über InternalsVisibleTo oder ähnliches) für die Plugin-Assemblys gewährt, aber nicht für allgemeine Benutzer.


Veranschaulichendes Beispiel

Angenommen, wir haben drei Assemblys. Meine Klasse (Klasse), eine Plugin-Assembly (Plugin) und eine Verbraucher-Assembly (Verbraucher).

Ein Interface, IReturnValue spezifiziert einen Rückgabewert der API (eine Methode oder Klasse in der Assembly Klasse). Das Problem ist folgendes: Ich möchte, dass Plugin schreibgeschützte (internal) Eigenschaften und Indexer an einer beliebigen Instanz von IReturnValue festlegen kann, möchte aber nicht, dass der Code von Verbraucher dies tun kann.

Da ein Plugin-System verwendet wird, kann ich im Voraus nicht wissen, welchen Assemblys InternalsVisibleTo gewährt werden soll.


In dieser Situation sollte es mich wirklich interessieren, ob Verbraucher die Rückgabetypen ändern? Es scheint mir, dass es ihr eigenes Verschulden ist, wenn sie dies tun. Und ich kann mir keine vernünftige Lösung für dieses Problem einfallen lassen.

3voto

Daniel Hilgarth Punkte 165768

Wie bereits in meinem Kommentar erwähnt, bin ich mir nicht sicher, ob ich Ihre Frage richtig verstanden habe.

Ich habe Ihre Frage folgendermaßen verstanden:

Sie haben eine Klasse A, die von Verbrauchern und Implementierenden verwendet wird. Verbraucher sollten nur Daten abrufen können, Implementierende sollten zusätzlich Daten setzen können.

In diesem Fall würde ich eine Schnittstelle erstellen, die den Bedürfnissen der Verbraucher mit nur Lesezugriff entspricht, und eine mit Lese-/Schreibzugriff für die Implementierenden.

UPDATE nach Aktualisierung der Frage:
Die nur-Lese-Schnittstelle für den Verbraucher existiert bereits: IReturnValue und sollte für diesen Zweck verwendet werden.

Alles, was Sie jetzt tun müssen, ist eine Schnittstelle zu erstellen, die entweder nur Schreibzugriff hat oder Lese-/Schreibzugriff, je nach Bedarf der API.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X