Frage

Hallo, ich habe eine Klassenbibliothek, die Methoden ausführt und viele verschiedene Klassen hat, die als Parameter für die Methodenaufrufe verwendet werden ... Ich erstelle einen WCF -Wrapper für diese Klassenbibliothek. Aber ich habe keine Erlaubnis, die Klassenbibliothek zu ändern.

Meine Frage ist nun, wie ich diese Klassen leicht als Datenverträge/DataMbers enthüllen kann.

Ich habe ungefähr 100 verschiedene Klassen, die ich für diese Methoden brauche.

Vielen Dank

War es hilfreich?

Lösung

Wenn Sie die Bibliothek wirklich nicht ändern können, glaube ich, dass Ihre einzige Wahl, die Klassen über WCF aufzudecken, darin besteht, Wrapper -Objekte für jede Methode zu erstellen. Ich würde mir ansehen, wie ein Codegenerator für diese Aufgabe geschrieben wird.

Sie können über die Art von Typen in der Baugruppe nachdenken, die Sie aussetzen möchten, um die benötigten Typ -Metadateninformationen zu erhalten.

Sie können so etwas wie T4 -Vorlagen (Teil von 2008 und höher) und der Verwendung verwenden T4 Toolbox So erstellen Sie den Codegenerator, um den Code für Sie zu schreiben. Sobald der Generator fertig ist, sollte dies leicht wiederholt werden, wenn sich Ihre Bibliothek jemals ändert. Es ist auch einfach, Fehler zu beheben, die den Codegenerator aktualisieren und erneut überlegen sind.

Die andere Option, die ich nur für die Vollständigkeit erwähne, aber einige heikle Probleme haben, wäre, den fraglichen Code zu zerlegen und zu pflücken. Sie können so etwas wie ildasm verwenden, um die IL der Baugruppe zu entfernen, die erforderliche WCF -Zuordnung hinzuzufügen und sie dann mit Ilasm zusammenzustellen. Der Prozess kann jedoch fehleranfällig sein. Wenn die Versammlung ändert, müssen Sie den Prozess wiederholen, es kann rechtliche Probleme geben, je nachdem, wem das IP der Versammlung gehört, und Sie müssen die Versammlung erneut unterzeichnen. Potenziell mit einem anderen kryptografischen Zertifikat, wenn es eine stark benannte Versammlung sein muss.

* Bearbeiten *

Angeforderte Wrapper -Code -Beispiel:

public class ToWrap {
  public String Name { get; set; }
  public String Address { get; set; }
}

[DataContract]
public class Wrapper {
  private ToWrap _wrapped;

  // constructor for WCF marshalling
  public Wrapper() {
    _wrapped = new ToWrap();
  }

  public Wrapper(ToWrap wrapped) {
    _wrapped = wrapped;
  }

  [DataMember]
  public String Name {
    get { return _wrapped.Name; }
    set { _wrapped.Name = value; }
  }

  [DataMember]
  public String Address {
    get { return _wrapped.Address; }
    set { _wrapped.Address = value; }
  }
}

Andere Tipps

Wenn diese Klassen als [serialisierbar] gekennzeichnet sind, können Sie sie immer noch in einem WCF -ServicEContract verwenden. Wenn dies nicht der Fall ist, gibt es jedoch keine einfache Möglichkeit, dies zu tun. Sie hätten keine andere Wahl, als neue Klassen mit den gleichen Eigenschaften zu erstellen und sie dann jedes Mal, wenn Sie eine der Funktionen der Bibliothek aufrufen wollten, Eigenschaften für Eigentum in die Äquivalente der Bibliothek zu kopieren.

Beginnend mit .NET 3.5 SP1 Sie müssen nicht mehr einen DataContract angeben. Sie können einfach die Klassen in Ihrem ServicEContract verwenden.

Eine vollständige Erklärung finden Sie unter Diese verwandte Frage, in dem erörtert wird, wann sie verwendet werden und wann kein DataContract und die Konsequenzen verwendet werden sollen.

Ich habe es nie versucht, aber Sie könnten versuchen, die Attribute mit Teilklassen und Teilmethoden hinzuzufügen.

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