2008-11-19 10 views
50

VS.net crea una plantilla cuando crea un proyecto WCF.¿Cuál es el punto de un DataContract en WCF?

Se añade una clase al archivo IService1.cs:

// Use a data contract as illustrated in the sample below to 
// add composite types to service operations. 
[DataContract] 
public class CompositeType 
{ 
    bool boolValue = true; 
    string stringValue = "Hello "; 

    [DataMember] 
    public bool BoolValue 
    { 
     get { return boolValue; } 
     set { boolValue = value; } 
    } 

    [DataMember] 
    public string StringValue 
    { 
     get { return stringValue; } 
     set { stringValue = value; } 
    } 
} 

Desde un servicio WCF puede devolver cualquier clase definida por el usuario, ¿por qué utilizar una clase DataContract y CompositeType?

puedo volver algo como:

[OperationContract] 
MyUserCollection GetUsers(); 

¿Qué me falta?

+19

Si tiene .NET en ambos extremos del cable, que está muy bien. ¿Qué sucede si tiene un cliente Java llamando a su servicio? Si coloca sus datos dentro de DataContracts, esa información se almacena en los metadatos WSDL/XSD y también puede ser utilizada por clientes que no sean .NET. –

Respuesta

51

DataContract es solo una definición formal de un tipo que se puede entender en ambos lados del límite del servicio.

Si devuelve, como en su ejemplo, un objeto "MyUserCollection", los consumidores de su servicio necesitarán hacer referencia a las entrañas de su servicio/sistema, que es una violación del principio SOA de los límites explícitos. Al usar un DataContract, usted está publicando la estructura de sus tipos de devolución de una manera flexible.

+2

Mi WCF está siendo consumida por aplicaciones escritas por mí, por lo que en todos los aspectos prácticos debería estar bien (para voilar SOA). ¿Estás de acuerdo? – Blankman

+1

Probablemente podrías, pero ¿por qué querrías? Agregar el atributo es sencillo y es la forma recomendada de trabajar con WCF. –

+0

Scott, entonces solo agrego mi MyUserCollection a la clase CompositeType y al bingo? – Blankman

26

Otra cosa interesante de notar, es que si decora su código con DataContract, tiene mucho control sobre lo que el cliente puede ver y debe devolverlo a su servicio. Por ejemplo:

[DataContract] 
public class SampleClass 
{ 
    [DataMember(IsRequired=true)] 
    public int MyRequiredProperty { get; set; } 

    [DataMember] 
    public int MyOptionalProperty { get; set; } 

    public int MyInternalProperty { get; set; } 
} 

En el ejemplo anterior, se define que cuando se reciben datos, debe tener MyRequiredProperty, y que puede tener o no MyOptionalProperty. Además, el cliente nunca verá MyInternalProperty (esto puede ser, por ejemplo, una propiedad que ayuda con su lógica internamente, pero no desea que se exponga a nivel del cliente).

2

No estoy de acuerdo con el afiche que dijo "The DataContract es solo una definición formal de un tipo que se puede entender en ambos lados del límite del servicio".

La palabra clave aquí es "tipo". En .NET, un tipo es un objeto que puede tener campos, propiedades y métodos. Sin embargo, cuando decora una clase con DataContract en su servicio WCF, el resultado no es la clase que se trasplanta mágicamente en el código de llamada; ¡ni por asomo! En el código de llamada, tendrá una clase "proxy". La clase proxy recibe XML que representa el contenido del contrato de datos. El código de llamada puede recibir estos valores XML a través de la clase proxy, pero no , no dar acceso al código de llamada a las entrañas de la clase decorate con datacontract.

+0

Su afirmación "un tipo es un objeto" es confusa y engañosa. Object es un tipo de tipo, como enteros y cadenas son tipos. Solo para mayor claridad, el tipo es un identificador del cual el objeto es uno, cadena otro, como es entero, booleano, etc. – htm11h

2

Para responder a "marc_s":

"Si tiene .NET en ambos extremos del cable , eso está bien ¿Qué pasaría si tiene un cliente Java de llamar al servicio de Si.? ponga sus datos dentro de DataContracts, esa información obtiene almacenada en los metadatos WSDL/XSD y puede ser utilizada por clientes que no sean .NET, también. "

Creo que es falso.Vamos a tratar de hacer esto:

  1. utilizar el ejemplo predeterminado del proyecto WCF con una clase con atributos DataContract en clases y DataMember en los miembros, y un método que devuelve este tipo.
  2. Compilarlo y mostrar el wsdl. El xsd contiene la definición de CompositeType. DE ACUERDO.
  3. Ahora borremos todos los atributos DataContract y DataMember
  4. Compártelo y visualice el wsdl. ¡El xsd todavía contiene la definición de ComposityType! (es más obvio con un SCM suave, que no muestra ninguna diferencia en los archivos entre los pasos 2 y 4)

¡De modo que un cliente de Java debería gestionar esto sin DataContract ni DataMember! ¿Estoy equivocado o qué?

+2

No te equivocas, Walter. (Yo bromeo, bromeo) El trato es que tu consumidor aún necesita saber el formato, ¿correcto? Si estás en .NET-land en ambos lados, estás bien simplemente haciendo referencia al objeto. No puede importar un objeto .NET en Java [fácilmente], por lo que debe exponer el formato de otra manera.No estoy seguro de por qué 4 sería cierto. Creo que el trato es que no debería, ¿correcto? Aunque admitidamente estoy aquí principalmente por la oportunidad de citar a El Duderino. – ruffin

11

Hay otro uso importante, puede cambiar el nombre de la clase y las propiedades. Es una característica útil durante la serialización y la deserialización.

[DataContract(Name="EmployeeName")] 
public class Person 
{ 
    [DataMember(Name="FullName")] 
    public string Name { get; set; } 

    [DataMember(Name="HomeAddress")] 
    public string Address { get; set; } 
} 
0

Tal vez no muy utilizado, podríamos utilizar [DataContract] para pasar a través de variables privadas. DataContractSerializer serializará/deserializará solo los tipos visibles públicamente si el atributo [DataContract] no se utiliza.

[DataContract] 
public class SampleClass 
{  
    [DataMember] 
    private int MyPrivateProperty { get; set; } 
} 

(Nota: Si va a generar un proxy a continuación, los miembros privados se exponen como pública)

Cuestiones relacionadas