miércoles, 29 de agosto de 2007

Implementar una interface con un solo clic

Hace tiempo prometí explicar cómo se puede implementar una interface con sólo 2 clics, pero me he dado cuenta de que únicamente hace falta 1.

Qué es una interface y qué los dos tipos de implementación que podemos usar lo tenéis muy bien explicado en esta página.
Una vez vista la teória, voy a ir a un ejemplo mucho más práctico para demostrar como funciona otra de las ayudas de Visual Studio 2005. Supongamos que tenemos la siguiente interface:
Una interface muy sencilla con 2 métodos, bien, creamos una clase que la va a implementar:


Si os fijáis, el IDE de Visual Studio hace que aparezca un pequeño rectángulo azul debajo del nombre de la interface (cuando el cursor está sobre antes, después o en medio del nombre de la interface), este rectángulo será el que nos ayude a implementarla.
Vamos a pasar el ratón sobre el rectángulo, y veamos que pasa:


(clic en la imagen para ampliar)

Vaya, se despliega este menú para implementar la interface, hagamos clic en la primera opción:


(clic sobre la imagen para ampliar)

Ya tenemos la interface implementada con tan solo 1 clic. Bueno, falta escribir el código de los métodos, pero en principio ya funcionan (aunque sólo lancen una excepción).

Pero alguno puede pensar, “vaya tontería, esos 2 métodos no me cuesta tanto escribirlos”, y tiene razón, pero
- ¿qué pasa si la interface tiene 200 métodos?
o
- ¿qué pasa si no tenemos documentación sobre los métodos porque es una interface del sistema o de un tercero?
En estos casos el IDE de Visual Studio viene en nuestra ayuda, como hemos visto.

Casi se me olvida, ¿qué pasaría si a la interface le añadiésemos un método?, tal que así:



Pues lo único que tenemos que hacer es volver a realizar los mismos pasos, cursos sobre el nombre de la interface, ratón sobre el rectángulo azul y clic sobre la opción:



(clic en la imagen para ampliar)

viernes, 24 de agosto de 2007

Estoy Leyendo...

De vuelta de unos días de descanso he decidido hacer unos cambios en el blog. Si os fijáis en el panel de la derecha, debajo de las etiquetas, he añadido una sección con los libros que estoy leyendo actualmente.

Me parece que la primera vez que vi algo así fue en el blog de Rodrigo Corral y me pareció muy buena idea, sobre todo porque Rodrigo también comenta los libros, yo intentaré imitarle (siempre hay que copiar de los mejores) y cuando acabe de leerlos o los tenga muy avanzados escribiré un post, aunque supongo que las más 500 páginas de WCF step by step y las más de 700 de CLR via C# me tendrán entretenido una buena temporada.

La verdad es que también me gustaría tener un apartado de "Jugando a..." como César Reneses pero no dispongo de tiempo, tal vez cuando esté de vacaciones.

jueves, 9 de agosto de 2007

Principios del desarrollo de software

Hace un par de días leí en Navegapolis la traducción de los principios del Waterfall Manifesto y la verdad es que me identifico mucho con estos 2 (en negrita mis comentarios):

- Los cambios de requisitos son un grano en el culo, sobre todo cuanto más tarde te los dicen. Házselo saber al cliente y haz que pague caro si está pensando siempre en cambios.

Quien no se ha encontrado con un cliente/jefe que cambia los requerimientos cada 2 días, dependiendo de como se levante esa mañana. A un cliente le puedes cobrar por los cambios, pero ¿qué haces si es tu jefe?

- Los buenos procesos forjan héroes. Los gestores, programadores y usuarios tienen que saberlo y reconocer que se enfrentan a un difícil reto.

Totalmente cierto, el poder finalizar con éxito algunos proyectos sólo puede ser tarea de un héroe.


Y este otro es una verdad como un templo:

- La complejidad -el arte de maximizar el tiempo necesario para comprender tu diseño y tu código- es esencial para que se vea tu valor como programador (y garantizar tu puesto de trabajo).

Sin palabras.

miércoles, 8 de agosto de 2007

Montar un servicio WCF en 10 pasos

Para los que no conozcáis Windows Comunication Foundation (WCF para los amigos) os dejo unos cuantos enlaces muy recomendables:

Visión Global de Arquitectura de Windows Communication Foundation

Artículos de Aaron Skonard en MSDN Magazine (aunque los veáis en inglés, redirecciona a los artículos en castellano)

Artículos de Juval Lowy en MSDN Magazine (lo mismo que los de Skonnard)

Fundamentals of WCF Security – Michele Leroux Bustamante (en inglés, pero merece el esfuerzo)

Blog de Oskar Álvarez en Geeks.ms

En este post me voy a centrar en la implementación de un servicio WCF muy básico y con pasos muy concretos (algunos mucho más fáciles que otros).

Empecemos, en Visual Studio creamos una solución en blanco (a mi me gusta trabajar así, cada cual con sus manías), a la que añadimos dos proyectos de consola (con C#): Host y Cliente.

Y ahora vamos por partes:

Proyecto Host

1. Agregar referencia al ensamblado System.ServiceModel.

2. Definir una interface con el atributo [ServiceContract] para indicar que es la que define el contrato de WCF. Los métodos de esta interface que se vayan a exponer en deben incluir el atributo [OperationContract].




[ServiceContract]
public interface IClase
{
[OperationContract]
string Funcion1();

[OperationContract]
int Funcion2();

// Este método no se expone porque no tiene el atributo
//[OperationContract]
void MetodonoImplementado();
}


3. Definir una clase que implemente la interface IClase (en un futuro post explicaré cómo se implementa una interface con sólo dos clics).



class Clase : IClase
{
string IClase.Funcion1() { return "Respuesta"; }

int IClase.Funcion2(){ return 10; }

void IClase.MetodonoImplementado(){ return; }
}




4. Añadimos un fichero de configuración (app.config) al proyecto, para establecer las propiedades del servicio.


<?xml version="1.0" encoding="utf-8" ?>
<configuration>
<system.serviceModel>
<services>
<!--Comportamiento se define un poco más abajo, en la sección BEHAVIORS-->
<service name="Host.Clase" behaviorConfiguration="Comportamiento">
<host>
<!--Se establece la URL del servicio-->
<baseAddresses>
<add baseAddress="http://localhost:8000/WCF/"/>
</baseAddresses>
</host>
<!--En el enpoint se define el ABC de los servicios WCF, Address, Binding y Contract-->
<endpoint address="Clase"
binding="wsDualHttpBinding"
contract="Host.IClase"/>
</service>
</services>
<behaviors>
<serviceBehaviors>
<behavior name="Comportamiento">
<serviceMetadata httpGetEnabled="true"/>
</behavior>
</serviceBehaviors>
</behaviors>
</system.serviceModel>
</configuration>




5. En el método Main() iniciamos el servicio.



class Program
{
static void Main(string[] args)
{
Type tipo = typeof(Clase);
using (ServiceHost miHost = new ServiceHost(tipo))
{
miHost.Open();
Console.WriteLine("Servicio en ejecución");
Console.WriteLine("Pulse una tecla para salir...");
Console.ReadKey();

miHost.Close();
}
}




6. Ejecutamos únicamente el proyecto Host.

7. Desde la consola de Visual Studio * ejecutamos la herramienta svcutil.exe, que creará los ficheros que servirán de proxy entre el cliente y el servicio.




Se crean 2 ficheros:
- Clase.cs - definición del proxy.
- Output.config - fichero de configuración, que debe ser renombrado como
app.config para los proyectos Windows (web.config para proyectos Web)

* Consola de Visual Studio, la podemos encontrar en: Inicio - Todos los programas - Microsoft Visual Studio 2005 - Herramientas de Visual Studio


Paramos la ejecución y pasamos al otro proyecto.

Proyecto Cliente

8. Agregamos la referencia al ensamblado System.ServiceModel, igual que el paso 1 del proyecto Host.

9. Añadimos los ficheros que genera la herramienta svcutil.exe (paso 7 del proyecto Host), Clase.cs y app.config.

10. En el método Main() iniciamos el proxy y ejecutamos los métodos.

class Program
{
static void Main(string[] args)
{
Console.WriteLine("Pulse cualquier tecla cuando el servicio esté iniciado...");
Console.ReadKey();

using (ClaseClient proxy = new ClaseClient(“WSDualHttpBinding_IClase”))
{
Console.WriteLine(proxy.Funcion1());
Console.WriteLine(proxy.Funcion2().ToString());
Console.WriteLine("Pulse cualquier tecla para salir...");
Console.ReadKey();
proxy.Close();
}
}
}




Ya lo tenemos todo listo, vamos a probarlo, para ello tenemos que ejecutar los dos proyectos al mismo tiempo, por lo que en las propiedades de la solución hay que establecer Proyectos de inicio múltiples y establecer la acción de ambos proyectos a Iniciar, y ejecutar (F5).



Por supuesto que WCF es mucho más complejo, pero como toma de contacto creo que está bien, en próximos post entraremos en profundidad en más características.