DataContract WCF pour les classes dans une bibliothèque que je ne peux pas modifier

StackOverflow https://stackoverflow.com/questions/5344121

  •  27-10-2019
  •  | 
  •  

Question

Salut j'ai une bibliothèque de classe qui effectue des méthodes et a beaucoup de différentes classes qu'il utilise en tant que paramètres pour les appels méthodes ... je suis en train de créer une enveloppe WCF pour cette bibliothèque de classes. mais je n'ai pas la permission de modifier la bibliothèque de classes.

Ma question est de savoir comment puis-je exposer ces classes comme contrats de données / DataMembers facilement ..?

J'ai environ 100 classes différentes que je besoin de ces méthodes.

Merci

Était-ce utile?

La solution

Si vous ne pouvez vraiment pas changer la bibliothèque, alors je crois que votre seul choix pour exposer les classes via WCF est de créer des objets wrapper pour chaque méthode. Je regardais écrire un générateur de code pour cette tâche.

Vous pouvez réfléchir sur l'ensemble des types dans l'ensemble que vous souhaitez exposer à obtenir les informations de métadonnées de type que vous avez besoin.

Vous pouvez utiliser quelque chose comme des modèles de t4 (partie de VS 2008 et au-dessus) et le T4 Boîte à outils pour créer le générateur de code pour écrire le code pour vous. Une fois que le générateur est fait, il devrait être facile de relancer à nouveau si votre bibliothèque change jamais. Il est également facile de bugs fix mise à jour du générateur de code et réexécution il.

L'autre option que je ne mentionne que pour être complet, mais qui a des questions épineuses seraient à désassembler le code et le patch en question. Vous pouvez utiliser quelque chose comme ildasm pour vider les il de l'assemblée, ajouter l'attribution WCF nécessaire, puis réassembler avec ilasm. Cependant, le processus peut être sujet aux erreurs, à tout moment l'ensemble des changements que vous devrez refaire le processus, il pourrait y avoir des problèmes juridiques en fonction de qui est propriétaire de l'adresse IP de l'assemblée, et vous devrez re-signer l'assemblée, potentiellement avec un cert cryptographique différent si elle a besoin d'être un assemblage nom fort.

* Edit *

demandé wrapper exemple de code:

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; }
  }
}

Autres conseils

Si ces classes sont marquées comme [Serializable] alors vous pouvez toujours les utiliser dans un WCF ServiceContract, mais si elles ne sont pas alors il n'y a aucun moyen facile de le faire. Vous auriez pas d'autre choix que de créer un nouvel ensemble de classes qui ont les mêmes propriétés, puis copiez les biens par la propriété dans les équivalents de la bibliothèque chaque fois que vous vouliez appeler l'une des fonctions de la bibliothèque.

A partir de .Net 3.5 SP1 vous ne sont plus nécessaires pour spécifier un DataContract. Vous pouvez simplement utiliser les classes au sein de votre ServiceContract.

Pour une explication complète, consultez cette question connexe, qui explique quand utiliser et quand ne pas utiliser un DataContract et les conséquences.

J'ai jamais essayer, mais vous pouvez essayer d'ajouter des attributs à l'aide des classes partielles et des méthodes partielles.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top