Frage

Das Hinzufügen eines Service Verweis auf einen Webdienst (das ist alles, WCF) in Visual Studio produziert ausgesetzt einige generierte Code einschließlich einer clientseitigen Neuformulierung der Schnittstelle ist.

Ich verstehe, warum diese Schnittstelle erzeugt wird. Sie könnte eine 3rd-Party-Service raubend und keinen Zugriff auf die eigentliche Schnittstelle

Aber ich tun, und die beiden sind nicht Zuordnung kompatibel, obwohl der transparente Proxy ist in der Tat genau die Schnittstelle implementieren, auf die ich werfen wollen.

kann ich Reflexion, aber das ist hässlich. Gibt es eine Möglichkeit, diese faux Art Sicherheit zu besiegen und zu injizieren Metadaten so kann ich eine Schnittstelle mit einer Klasse verwenden?


Ihr spezifisches Problem weicht von der Norm auf komplizierte Weise, die mit einem einzigen Kunden zu tun haben, dass einige Derivate von einer Basisklasse verwendet direkt und verwendet andere remote über Service Referenzen. Die Basisklasse für jeden Server benötigt Referenzen zu halten für ihre Kunden in einer Sammlung für die Zählung der abonnieren Ereignisse zu informieren, und das Problem war, Typ variiert aufgrund der Verwendung von Proxies.

Keine dieser Antworten löst mein spezifisches Problem, doch jede einzelne Antwort war lehrreich und hilfreich. Ich fand meine eigene Lösung (mit einer Doppelbindung), aber ich hätte es nie herausgefunden, wenn man nicht radikal hat mein Verständnis des gesamten Unternehmens verbessert werden.

Drei ausgezeichnete Antworten. Wie einfach man wählen? Ich wähle die erste, weil es direkt das Problem löst ich zuerst dachte ich hatte.

War es hilfreich?

Lösung

Wenn Sie den Dienstverweis hinzufügen, gehen Sie auf „Erweitert“ und stellen Sie sicher, „Reuse Typen in referenzierten Assemblys“ ausgewählt ist und dass die Montage Ihrer Interface-Definition enthält, ausgewählt ist. Sie können auch mit einem bestehenden Dienstverweis mit der rechten Maustaste darauf und gehen auf „Konfigurieren“.

tun dies

Andere Tipps

Wenn Sie bereits den Vertrag dll auf dem Client haben, brauchen Sie nicht einmal einen Dienstverweis (es sei denn, Sie es verwenden Sie den Setup-Code zu schreiben) - Sie können einfach Unterklasse Client und den Kanal freizulegen, und die Nutzung dass direkt - so etwas wie (kein IDE praktisch ...):

public class WcfClient<T> : ClientBase<T> where T : class
{
    public new T Channel {get {return base.Channel;}}
}

Dann können Sie einfach Dinge tun, wie:

using(var client = new WcfClient<IFoo>())
{
    client.Channel.Bar(); // defined by IFoo
}

Sie müssen noch die Konfigurationseinstellungen in der Config die Adresse, um zu bestimmen, Bindung, etc. - aber weniger chaotisch als Proxy-Generierung. Auch könnten Sie neu implementieren IDipsoable mit der Tatsache zu tun, dass WCF-Proxys in Dispose() werfen kann (was schlecht ist):

public class WcfClient<T> : ClientBase<T>, IDisposable where T : class
{
    public new T Channel {get {return base.Channel;}}
    void IDisposable.Dispose() {
        try {
           switch(State) {
              case CommunicationState.Open: Close(); break;
              // etc
           }
        } catch {} // swallow it down (perhaps log it first)
    }
}

Um eine Schnittstelle von einem Dienst Sie das Knowntype Attribut verwenden müssen zurückzukehren:

Gibt es irgendeine dieser Hilfe?

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top