2012-04-02 12 views
11


tengo dos clases de datos que contienen solo miembros de datos (sin funciones). Uno es CallTask ​​ y el otro es SmsTask. Estas dos clases tienen algunas propiedades comunes como ID, Tel. Puse estas propiedades comunes en una clase de interfaz separada y utilizo esta clase de interfaz en mi proyecto cuando corresponde.
Ahora agregué un WCFService a mi proyecto para compartir datos entre los clientes y el servidor. Considere el siguiente diseño de la clase:
cómo marcar una interfaz como DataContract en WCF

public interface IGsmTask : IComparable 
{ 
    string TaskID { get; set; } 
    string SessionID { get; set; } 
    string Tel { get; set; } 
} 

class CallTask : IGsmTask 
{ 
    #region IGsmTask Members 

    public string TaskID { get; set; } 

    public string SessionID { get; set; } 

    public string Tel { get; set; } 

    #endregion   
} 

class SmsTask : IGsmTask 
{ 
    #region IGsmTask Members 

    public string TaskID { get; set; } 

    public string SessionID { get; set; } 

    public string Tel { get; set; } 

    #endregion 

    public string SmsText { get; set; } 
} 

en este diseño, quiero acoger callTask, SmsTask y IGsmTask a los clientes a utilizar estos en methots de servicios como los siguientes;

[OperationContract] 
    public void AddTask(IGsmTask task) 
    { 

    } 

traté de marcar [DataContract] en IGsmTask pero me da error complition. ¿No hay alguna methot que pueda usar interfaces como DataContracts? ¿O cómo debería usar los tipos KnownAttributes en este synerio?
Gracias.

+1

cambio en la interfaz de la clase – Reniuz

+0

Gracias Reniuz parece que no puedo utilizar las interfaces para este propósito. – Fer

+1

WCF es un sistema ** basado en mensajes: el cliente envía un mensaje serializado XML al servidor. Como tales, esos mensajes deben ser ** tipos concretos ** que se pueden serializar en XML y representar con un esquema XML. Las interfaces no se pueden serializar en XML ... –

Respuesta

11

Por lo que sé, el uso de interfaces como datos no es posible. Puede usar una clase base y agregar atributos de tipo de conocimiento en el otro.

+0

pensé que habría un methot usando interfaces como datoscontractos. si no es posible, tendré que cambiar mi interfaz a una clase base. Gracias. – Fer

+1

Dado que la serialización se basa en instancias de objeto, creo que no hay una manera directa de hacerlo. – daryal

8

Fer: Todo es posible con el diseño correcto.

Si el problema es:

Una clase es un contrato de datos

& &

1 o más de sus propiedades debe ser una interfaz ...

public interface ICustomInterface 
{ 
    int Property1 {get;set} 
} 

[DataContract] 
public class MyClass 
{ 
    [DataMember(Name="_myInterface")] 
    public ICustomInterface MyInterface {get;set;} 
} 

El El problema es que cuando se produce la deserialización - No hay forma de convertir los datos en una clase que implementa ICustomInterface.

La solución consiste en crear una clase concreta que implemente la interfaz, y convertir el captador/instalador de la propiedad pública (que es de tipo interfaz) en una propiedad privada de la clase concreta.

public class CustomInterfaceImplementor: ICustomInterface 
{ 
    public int Property1 {get;set;} 
} 

[DataContract] 
public class MyClass 
{ 
    [DataMember(Name="_myInterface")] 
    private CustomInterfaceImplementor _MyInterface; 
    public ICustomInterface MyInterface 
    { 
      get {return (_MyInterface as ICustomInterface);} 
      set {_MyInterface = (value as CustomInterfaceImplementor);} 
    } 
} 
Cuestiones relacionadas