Pregunta

Hola, tengo una biblioteca de clase que realiza métodos y tiene muchas clases diferentes que utiliza como parámetros para las llamadas de métodos ... Estoy creando un envoltorio WCF para esta biblioteca de clases. Pero no tengo permiso para cambiar la biblioteca de clases.

Ahora, mi pregunta es ¿cómo puedo exponer estas clases como contratos de datos/cementeros de datos fácilmente ...?

Tengo alrededor de 100 clases diferentes que necesito para esos métodos.

Gracias

¿Fue útil?

Solución

Si realmente no puede cambiar la biblioteca, entonces creo que su única opción para exponer las clases a través de WCF es crear objetos de envoltura para cada método. Me gustaría escribir un generador de código para esta tarea.

Puede reflexionar sobre el conjunto de tipos en el ensamblaje que desea exponer para obtener el tipo de información de metadatos que necesita.

Puede usar algo como T4 Plantates (parte de VS 2008 y superior) y el Caja de herramientas T4 Para crear el generador de código para escribir el código por usted. Una vez que se realiza el generador, debería ser fácil volver a ejecutar si su biblioteca alguna vez cambia. También es fácil solucionar errores actualizando el generador de código y volver a ejecutarlo.

La otra opción que menciono solo por integridad pero que tiene algunos problemas espinosos sería desmontar y parchear el código en cuestión. Puede usar algo como ILDASM para volcar la IL del ensamblaje, agregar la atribución WCF necesaria y luego volver a montarlo con ILASM. Sin embargo, el proceso puede ser propenso a errores, cada vez que el ensamblaje cambie, tendrá que rehacer el proceso, podría haber problemas legales dependiendo de quién sea el propietario de la IP del ensamblaje y tendrá que volver a firmar el ensamblaje, Potencialmente con un certificado criptográfico diferente si necesita ser un ensamblaje de nombre fuerte.

* Editar *

Muestra de código de envoltorio solicitado:

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

Otros consejos

Si esas clases están marcadas como [serializables], entonces puede usarlas en un contrato de servicio WCF, pero si no lo son, entonces no hay una manera fácil de hacerlo. No tendría más remedio que crear un nuevo conjunto de clases que tengan las mismas propiedades, y luego copiarlas propiedad por propiedad en los equivalentes de la biblioteca cada vez que quisiera invocar una de las funciones de la biblioteca.

Comenzando con .NET 3.5 SP1 ya no está obligado a especificar untrato de datos. Simplemente puede usar las clases dentro de su ServiceContract.

Para una explicación completa, consulte Esta pregunta relacionada, que discute cuándo usar y cuándo no usar un contrato de datos y las consecuencias.

Nunca lo intenté, pero podrías intentar agregar los atributos usando clases parciales y métodos parciales.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top