2 Stimmen

Ein Interface und zwei Implementierungsklassen (Proxy) in C#

Ich versuche, eine Funktion zu einer vorhandenen Codebasis in C# hinzuzufügen und eine API aufzurufen, sagen wir MyAPI(arg1,arg2). Ich habe ein Interface, nennen wir es IProvider, das eine Reihe von Client-seitigen API-Definitionen hat. Ich habe zwei Client-Proxy-Klassen - Provider und ProviderNew, die einige Wrapper-Implementierungen für die APIs haben - innerhalb jeder dieser Wrapper-Funktionen (für APIs) rufen wir letztendlich die Service-API auf, die auf einem entfernten Server gehostet ist. Nur unter der ProviderNew (nicht Provider) Projekt-Klasse - unter Serviceverweisen - sehe ich, dass MyAPI in WSDL, xsd-Dateien definiert ist (oder automatisch generiert wird, da ich nicht sicher bin, wie diese Dateien erstellt werden). Darüber hinaus sehe ich eine references.cs-Datei nur für ProviderNew, die einige Definitionen für MyAPI enthält. Diese Dinge deuten eindeutig darauf hin, dass nur ProviderNew den Client-seitigen Proxy-Code für MyAPI implementiert.

Mein Problem jetzt ist, dass da IProvider die MyAPI-Signatur definiert, das System erwartet, dass beide implementierenden Klassen (Provider und ProviderNew) den Client-Code für MyAPI implementieren, was jedoch nicht der Fall ist, da nur ProviderNew Definitionen für MyAPI hat. Wenn ich versuche, den MyAPI-Client-Code nur in Provider.cs zu implementieren, erhalte ich einen Fehler:

Provider.ProviderServiceReference.ProviderServiceClient enthält keine Definition für 'MyAPI' und keine Erweiterungsmethode 'MyAPI', die ein erstes Argument vom Typ 'Provider.ProviderServiceReference.ProviderServiceClient' akzeptiert, konnte gefunden werden (fehlt Ihnen eine Verwendungsrichtlinie oder eine Assembly-Verweis?) MyPath..\Provider.cs

Aber wenn ich sie in Provider.cs nicht implementiere, erhalte ich einen Fehler (Dies ist ein klassischer Fall, dass jede Klasse (wenn es mehrere Implementierungen gibt), die ein Interface implementiert, alle ihre Funktionen individuell von selbst implementieren sollte und nicht eine Teilmenge von Funktionen.)

'Provider' implementiert keine Schnittstellenmember 'IProvider.MyAPI(int, int)' MyPath ...Provider.cs

Ich habe mein Bestes gegeben, um dies so deutlich wie möglich zu machen, lassen Sie mich für weitere Klarheit wissen.

Wie gehe ich jetzt vor? Irgendwelche Vorschläge?

1voto

Tim Punkte 27854

Es kann nicht entschieden werden, welche Teile einer Schnittstelle von einer implementierenden Klasse implementiert werden - es ist alles oder nichts. Aus der Perspektive von WCF, wenn Sie Methoden für einen Client hinzufügen möchten, aber nicht für einen anderen, handelt es sich um zwei Dienste, nicht um einen.

Zum Beispiel, nehmen wir an, Sie haben den folgenden Vertrag:

[ServiceContract]
public interface IProvider
{

    [OperationContract]
    int MyApiCall_1(string param);

    [OperationContract]
    string MyApiCall_2(int number);
}

Der (anfänglich) von Provider implementiert wird. Alle Clients nutzen diesen Dienst problemlos.

Nehmen wir nun an, dass einer Ihrer Clients Zugriff auf MyApiCall_3 benötigt, die anderen jedoch nicht. Wie Sie festgestellt haben, handelt es sich hierbei um eine Änderung, die für alle Clients, die MyApiCall_3 nicht benötigen, eine Schwierigkeit darstellt.

Sie könnten einfach den Dienst aktualisieren - aber dann hätten alle Clients Zugriff auf MyApiCall_3, und vielleicht möchten Sie das aus einem bestimmten Grund nicht.

Eine weitere Option wäre das Erstellen eines anderen Vertrags (Schnittstelle), der von dem originalen erbt, so:

[ServiceContract]
public interface INewProvider : IProvider
{

    [OperationContract]
    double MyApiCall_3();
}

Dann würden Sie den Vertrag in einem neuen Dienst implementieren (zur Vereinfachung, nennen wir ihn NewProvider). Der Client, der den zusätzlichen API-Aufruf benötigt, würde NewProvider verwenden, und die anderen Clients würden weiterhin den älteren Provider verwenden.

Kurz gesagt, wenn Sie Funktionalitäten zu einem Vertrag hinzufügen, können Sie entweder:

1\.  Diese zusätzliche Funktionalität im ursprünglichen Vertrag verfügbar machen, sodass alle Clients Zugriff darauf haben, oder
2.  Einen neuen Vertrag erstellen, der vom ursprünglichen Vertrag erbt, und ihn über einen neuen Dienst freigeben. Dann würden nur die Clients, die die zusätzliche Funktionalität benötigen, den neuen Dienst verwenden.

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