Tutorial WCF (2 de 5)
Articulos anteriores:
Tutorial WCF (1 de 5)
2 - MONTANDO UN SERVICIO
La idea principal es que nuestro servicio será independiente de la forma en que nos comunicaremos con él.
El proceso de creación de un servicio se divide en dos partes:
- Definición y creación de un contrato: en éste definiremos la funcionalidad (métodos accesibles) que tendrá nuestro servicio y que datos (clases, estructuras, ...) utilizará para comunicarse.
- Creación de un servicio que "implemente" el contrato definido.
Así que esto es lo que haremos en este primer tutorial.
DEFINIENDO EL CONTRATO
Un contrato no es más que una interfaz tal y como la conocemos en el concepto de la POO. Vamos a definirlo.
Sin usar la plantilla que nos ofrecen las extensiones o "Orcas" por defecto para crear una WCF service Library, creamos un proyecto que sea de tipo librería en el lenguaje que más os guste; yo lo haré en C#. Para empezar crearemos una nueva interfaz en nuestro proyecto y la llamaremos IMiServicio. Es importante saber que para trabajar con WCF necesitamos añadir una referencia a nuestro proyecto (si no está ya) y hacer el "import/using" pertinente: System.ServiceModel.
1: using System;
2: using System.Runtime.Serialization;
3: using System.ServiceModel;
4: using System.Collections.Generic;
5:
6: namespace BlogWCF
7: { 8: [ServiceContract]
9: public interface IMiServicio
10: { 11:
12: [OperationContract]
13: List<Cumple> DameCumples();
14:
15: [OperationContract]
16: int DimeEdad(Cumple cu);
17: }
18:
19: [DataContract]
20: public class Cumple
21: { 22: string nombre = "";
23: DateTime fechaCumple = new DateTime();
24:
25: [DataMember]
26: public string Nombre
27: { 28: get { return nombre; } 29: set { nombre = value; } 30: }
31:
32: [DataMember]
33: public DateTime FechaCumple
34: { 35: get { return fechaCumple; } 36: set { fechaCumple = value; } 37: }
38: }
39: }
Para indicar que se trata de un contrato usamos el atributo ServiceContract al declarar la Interface. Para definir qué métodos tendrá el contrato usamos el atributo OperationContract.
Este contrato es el que usarán los clientes para saber que operaciones tiene un servicio y que datos intervienen en la comunicación.
En este caso usamos una clase nuestra llamada Cumple que interviene en la comunicación y deberá ser serializada. Para indicar que la clase también debe estar en el contrato usamos los atributos DataContract y DataMember para la deficinión de la clase y sus propiedades respectivamente. Esta clase debe cumplir los requisitos para que sea serializable ya que debe poder ser enviada mediante SOAP y XML si lo deseamos.
CREANDO EL SERVICIO
Ahora lo que debemos hacer es implementar esta Interfaz (contrato), y crear la clase que dará este servicio:
1: using System;
2: using System.Collections.Generic;
3:
4: namespace BlogWCF
5: { 6: public class MiServicio : IMiServicio
7: { 8: public List<Cumple> DameCumples()
9: { 10: List<Cumple> cumples = new List<Cumple>();
11: cumples.Add(new Cumple{ 12: Nombre="Jordi",
13: FechaCumple=new DateTime(1982,10,8)});
14: cumples.Add(new Cumple { 15: Nombre = "Alex",
16: FechaCumple = new DateTime(1982, 6, 13) });
17: cumples.Add(new Cumple { 18: Nombre = "Clara",
19: FechaCumple = new DateTime(1982, 3, 20) });
20:
21: return cumples;
22: }
23:
24: public int DimeEdad(Cumple cu)
25: { 26: int years = DateTime.Now.Year - cu.FechaCumple.Year -
27: (cu.FechaCumple.Month > DateTime.Now.Month ? 1 :
28: (cu.FechaCumple.Month != DateTime.Now.Month) ? 0 :
29: (cu.FechaCumple.Day > DateTime.Now.Day) ? 1 : 0);
30: return years;
31: }
32: }
33: }
Vemos que hemos creado una clase que implementa la interfaz que define el contrato. Podríamos añadir más métodos, propiedades y demás, pero no serían visibles desde un cliente ya que no están definidos en el contrato.
Ahora ya tenemos definido el servicio y lo que tenemos de decidir es cómo se va a acceder a él; SOAP y XML (Web Services), mediante HTTP/HTTPS, TCP,... y quien lo va a servir; el IIS, un servicio del sistema operativo, lo serivá otro programa, etc.
Pero esto se hace a parte de la definición del servicio, así separamos lo que es la funcionalidad de las comunicaciones.
Además, la definición de las comunicaciones la haremos mediante ficheros de configuración basados en XML, o sea, legibles y fácilmente editables. Así que, si decidimos un día cambiar un servicio que se está sirviendo como un servicio web a un servicio que se sirva por TCP por el puerto 8080, solo habrá que cambiar dos lineas del fichero de configuración y listos; no habrá que modificar el código de nuestro servicio.
Esto lo veremos en el próximo post: Sirviendo un Servicio de WCF.