2008-09-30 15 views
6

tengo una biblioteca con algunas entidades que comparten la misma interfaz. los clientes y el servicio comparten este ensamblaje. ahora me pregunto si hay una forma de tener este tipo de interfaz como parámetro en mis contratos de servicio para que pueda usar el mismo método para todas las clases que implementan la interfaz.Wcf e Interfaces como los parámetros

las entidades themselve están todas decoradas con datacontract-attribute y sus miembros con atributos de miembro de datos.

¿es posible? probablemente con el NetDataContractSerializer? sé que puedo hacerlo con una clase base (algunos clase abstracta, por ejemplo) y el know-type-atributo, pero definitivamente prefiero la interfaz como identificador de los objetos, ya que se utiliza ampliamente en la aplicación del cliente y sería fácil desarrollo.

gracias

Respuesta

6

Resolví el problema utilizando el atributo ServiceKnownType en las implementaciones de OperationContracts.

Al indicar a sus clases que implementan la interfaz como ServiceKnownType, puede usar la interfaz como parámetro y, por lo tanto, pueden usar todas las clases que implementen su interfaz, siempre que sean serializables. (Consulte "Programación de servicios WCF" en Juval Löwy, página 100)

1

Ciertamente, no es posible bajo "MEX" regulares. Es podría ser posible con el ensamblaje compartido, pero realmente no lo recomendaría, estás luchando contra WCF: será frágil, etc. Por supuesto, siempre puedes enmascarar esto en tu modelo de objeto, es decir, en lugar de llamar al [ OperationContract] directamente, abstraiga esto en un método envoltorio que oculta los detalles de WCF (tal vez usando diferentes objetos para la transferencia de datos de los que en realidad devuelve).

0

[Acabo de leer su respuesta y me di cuenta de que estaba preguntando específicamente sobre los parámetros a los métodos de servicio. Voy a dejar mis comentarios aquí en caso de que todavía están útil]

Lo que he hecho en proyectos donde sé que tengo WCF en ambos lados del alambre, es algo así como:.

Una biblioteca de sólo las interfaces compartidos, por ejemplo:

namespace SharedInterfaces { 
    public interface ICompositeType { 
     bool BoolValue { get; set; } 
     string StringValue { get; set; } 
    } 
} 

La biblioteca servicio WCF, donde los s [DataContract] (Pocos) implementan las interfaces compartidos.

[DataContract] 
public class CompositeType : ICompositeType { 
    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; } 
    } 
} 

En el cliente de servicio, cada POCO proxy puede ser "obligado" para implementar la compartida, desplegado, la interfaz usando una clase parcial (que de todos modos se si svcutil hizo su trabajo correctamente), y usted será capaz de para programar a la interfaz en el resto de su código de cliente:

namespace ServiceClient.ServiceReference1 { 
    public partial class CompositeType : ICompositeType { 
    } 
} 

Este parcial también es útil si desea agregar algunas propiedades o métodos adicionales que el cliente puede hacer uso de (conceptos por ejemplo presentador o ViewModel en. Patrones MVP o MVVM).

+0

+1 para En el cliente de servicio, cada proxy POCO puede ser "obligado" a implementar la interfaz compartida, implementada, utilizando una clase parcial. –

Cuestiones relacionadas