2012-02-10 13 views
5

No estoy seguro de si es un problema o no.IEnumerable vs List in the Response Class, ServiceStack

Si utilizo la lista aquí, funciona tanto en la raíz/xml/metadatos op = Concursos y competiciones raíz/

[DataContract] 
public class CompetitionsResponse : IHasResponseStatus 
{ 
    [DataMember] 

    public List<Competitions> Competitions { get; set; } 

    //Auto inject and serialize web service exceptions 
    [DataMember] 
    public ResponseStatus ResponseStatus { get; set; } 
} 

HTTP/1.1 200 OK Content-Type: application/xml Content longitud: longitud

<CompetitionsResponse xmlns:i="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://schemas.datacontract.org/2004/07/FSI.API.ServiceModel"> 
    <Competitions> 
    <Competitions> 
     <CompName>String</CompName> 
     <CompType>String</CompType> 
     <CompetitionID>0</CompetitionID> 
    </Competitions> 
    </Competitions> 
    <ResponseStatus xmlns:d2p1="http://schemas.servicestack.net/types"> 
    <d2p1:ErrorCode>String</d2p1:ErrorCode> 
    <d2p1:Errors> 
     <d2p1:ResponseError> 
     <d2p1:ErrorCode>String</d2p1:ErrorCode> 
     <d2p1:FieldName>String</d2p1:FieldName> 
     <d2p1:Message>String</d2p1:Message> 
     </d2p1:ResponseError> 
    </d2p1:Errors> 
    <d2p1:Message>String</d2p1:Message> 
    <d2p1:StackTrace>String</d2p1:StackTrace> 
    </ResponseStatus> 
</CompetitionsResponse> 

Pero si uso "IEnumerable"

[DataContract] 
public class CompetitionsResponse : IHasResponseStatus 
{ 
    [DataMember] 
    public IEnumerable<Competitions> Competitions { get; set; } 

    //Auto inject and serialize web service exceptions 
    [DataMember] 
    public ResponseStatus ResponseStatus { get; set; } 
} 

La colección competiciones desapareció de la página de meta root/xml/metadatos op = competiciones

HTTP/1.1 200 OK 

Content-Type:? Application/xml Content-Length: longitud

<CompetitionsResponse xmlns:i="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://schemas.datacontract.org/2004/07/FSI.API.ServiceModel"> 
    <Competitions i:nil="true" /> 
    <ResponseStatus xmlns:d2p1="http://schemas.servicestack.net/types"> 
    <d2p1:ErrorCode>String</d2p1:ErrorCode> 
    <d2p1:Errors> 
     <d2p1:ResponseError> 
     <d2p1:ErrorCode>String</d2p1:ErrorCode> 
     <d2p1:FieldName>String</d2p1:FieldName> 
     <d2p1:Message>String</d2p1:Message> 
     </d2p1:ResponseError> 
    </d2p1:Errors> 
    <d2p1:Message>String</d2p1:Message> 
    <d2p1:StackTrace>String</d2p1:StackTrace> 
    </ResponseStatus> 
</CompetitionsResponse> 

Respuesta

3

ServiceStack utiliza el. XML DataContractSerializer de XML bajo el capó de su Serialización XML, que es el comportamiento de su vista. También funciona con POCO, es decir, los atributos [DataContract] y [DataMember] son ​​opcionales.

Tampoco se recomienda el uso de interfaces en DTO (IMO no hay una buena razón para hacerlo) que debe ser tan tipeado y autodescriptivo como sea posible. Muchas serializaciones no sabrán cuál debe ser el tipo concreto de IEnumerable, por lo que tienen que hacer algunos hacks como los metadatos dinámicos de tipografía de información en la carga útil, o asumir un tipo de colección predeterminado.

Nota: Si desea que el XML sea más bonita que debe definir un espacio de nombres para sus OTD - la mejor manera de hacerlo es definir un atributo de ensamblado en sus AssemblyInfo.cs archivo:

[assembly: ContractNamespace("http://schemas.servicestack.net/types", 
    ClrNamespace = "FSI.API.ServiceModel")] 
+0

Me doy cuenta de que esto es bastante viejo, pero aún así. ¿No sería IEnumerable la única interfaz que desea utilizar al serializar? Permitiría devolver la colección. Al leer desde la base de datos y transmitir a la red, esta podría ser una optimización útil. – AVee