Mostrando las entradas con la etiqueta Diseño y Arquitectura. Mostrar todas las entradas
Mostrando las entradas con la etiqueta Diseño y Arquitectura. Mostrar todas las entradas

miércoles, 11 de abril de 2012

Compartiendo Servicios entre distintas granjas de SharePoint 2010 (Un caso práctico)

SharePoint 2010 dispone de una arquitectura de servicios flexible y fácil de configurar, de tal forma que podemos compartir los servicios entre distintas granjas de servidores de SharePoint.  El caso práctico que les voy a presentar es el siguiente:

1) Una Granja de SharePoint Server 2010 consta de 2 servidores donde este el portal de la organización. 

2) Una Granja de Project Server 2010 separada que consta de un servidor.

3) Motivación: Se desea que el perfil de usuario del portal de la organización sea el mismo para el servidor de Proyectos.

Diagrama de Configuración de Servicios Compartidos

image

En el diagrama muestra dos granjas de servidores distintas una para un portal de colaboración y la otra para hospedar Project Server 2010.  La granja para el portal de colaboración tiene publicado el servicio de Perfiles de Usuario y una realización de confianza hacia la granja que hospeda Project Server 2010 a través de compartir ambas granjas sus certificados. En la granja consumidor del servicio de perfiles de usuario solo hay una conexión o proxy hacia el servicio publicado de la granja emisor o que publica el servicio que en este caso es la granja del portal de colaboración.

Aspectos importantes a notar son: 

  • La administración de los perfiles de usuario son únicamente efectuados en la granja emisor, es decir los permisos y características sociales son administradas por la granja emisor y no por la granja consumidor.
  • Los perfiles de usuario son compartidos por ambas granjas por lo que no importa que aplicación están accediendo la misma información.

El procedimiento para publicar y consumir un servicio es el siguiente:

  1. Cree los certificados de ambas granjas. Es necesario para el intercambio de certificados entre los servidores. El consumidor tendrá el certificado raíz de la publicación de la granja, pero la granja emisor tendrá el certificado raíz y el certificado STS (Security Token Service) del consumidor.
  2. Copia el certificado de la granja emisor para la granja consumidor y los certificados (raíz y sts) de la granja consumidor a la granja emisor.
  3. Importe los certificados de la granja consumidor en la granja emisor (primero el raíz y luego el sts).
  4. Importe el certificado raíz de la granja emisor en la granja consumidor
  5. Publique el Servicio deseado en la granja emisor.
  6. Consuma el Servicio publicado en la granja consumidor (para ello es necesario copiar de la granja emisor el URN).

Para realizar el procedimiento a detalle siga los siguientes enlaces:

http://technet.microsoft.com/en-us/library/ee704552.aspx

http://technet.microsoft.com/en-us/library/ee704545.aspx

http://www.aiim.org/community/blogs/expert/Connecting-to-the-User-Profile-Service-Proxy

Si en caso no le funciona, puede utilizar la interface Web desde el Central Administration pueda importar nuevamente los certificados.

Los certificados debería esperar generar 3 archivos como los mostrados abajo:

image

Para revisar la relación de confianza puede hacerlo en Seguridad, Administra la confianza.

image

Ventana de publicación del Servicio:

image

Ventana al momento de presionar el botón Conectar en la página de servicios de aplicación:

image

Luego de realizar la conexión exitosa le mostrará en el menú del usuario conectado las opciones sociales que se habilitan cuando el servicio esta disponible.

Para incluir en el Search de la granja consumidor la búsqueda de personas, le recomiendo cree una nueva fuente de contenido y escriba la url sps3://ServerEmisor, haga una indagación o crawl y vea si no sucedió ningún error.

image

En este artículo vimos como compartir los servicios entre granjas distintas, aunque es una tarea cuidosa y un poco tediosa, para nada complicada, los beneficios son palpables a primera vista, como la mejor utilización de los recursos disponibles y la unificación de la información, como la regla a mayor disponibilidad de servicios más crítico se vuelve la infraestructura e interconexiones, pero ese mi querido amigo es otro tema que hablaremos en el futuro sobre configuraciones de alta disponibilidad.

ShareService4Fun,

Juan Manuel Herrera Ocheita

domingo, 11 de marzo de 2012

Asegurando nuestra granja de SharePoint 2010

Cuando pensamos en seguridad dentro de la empresa para los productos de Microsoft debemos hablar de los productos para servidores Microsoft Forefront.  Hoy en día Microsoft dispone de toda la gama de infraestructura necesaria para proteger los servidores Windows Server esta son: Firewall para protección de la red interna, Antivirus para los archivos de sistema y Antivirus para el contenido de los portales.

En este artículo echaremos un vistazo a los productos Forefront disponibles para proteger nuestra granja de Servidores SharePoint 2010 y mencionaremos los otros productos que podrían estar en un escenario real dentro de las organizaciones.

Escenario:

El portal deberá exponerse de cara al internet para una extranet es decir usuarios internos que accederán el portal desde el internet.  Para ello realizaremos el siguiente diseño de arquitectura:

image

En este diseño los usuarios acceden desde una conexión al internet el portal Web de SharePoint no sin antes pasar por un primer filtro que delimita la forma de comunicarse al portal Web de SharePoint, esto lo hace a través del un servidor:

Forefront Threat Management Gateway 2010 o Forefront TMG-2010,esta configuración se le llama Edge Firewall, ya que el servidor se encuentra al final de la red interna y conectado directamente a la red externa.  Este es la primera línea de defensa limitando los puertos de acceso, inspeccionando el https. El cable de la WAN o sea que proviene del proveedor de Internet se conecta directamente a este servidor el cual tiene dos tarjetas de Red; una para la WAN y otra para la LAN o red Interna corporativa.

El Front-End de SharePoint que contiene la interfaz de usuario Web de SharePoint esta delimitada lógicamente en una zona desmilitarizada o DMZ, también es conocida como red perimetral.  Como el portal esta de cara al internet es recomendado que la comunicación sea a través de certificados de encriptación entre el cliente y el servidor y sea por medio del protocolo HTTPS o Secure Socket Layer. Aquí no se encuentra el Central Administration de SharePoint 2010 y mucho menos las bases de datos de contenido, únicamente la interfaz web que recibe las solicitudes filtradas del Forefront TMG-2010.  Aquí también instalaremos el producto para proteger todos los archivos que se suban y lean en las bibliotecas de SharePoint este es Forefront Protection 2010 for SharePoint o FPFS 2010.

El Back-End Forefront TMG 2010.  Este servidor en cuanto a producto es el mismo servidor de Edge Firewall, pero esta configurado para ser la ultima línea de defensa para la red interna o corporativa con reglas mas restrictivas especialmente para las solicitudes de entrada o inbound.

SharePoint Back-End or Database Server.  Aquí se encuentran todas las bases de datos de SharePoint (Configuración, Contenido, Servicios, Búsqueda, Perfiles de Usuario).

SharePoint Application Server; donde esta instalado el Central Administration.  Es una buena práctica recomendada por microsoft que el Central Administration este instalado en el servidor que tiene el Rol de Aplicación y que no este en el servidor Front-End donde esta expuesto a los ataques de usuarios malintencionados.   Si nos atacan el servidor Front-End no podrá afectar mucho mas allá de los servicios de la interfaz web y posiblemente la extracción del contenido del portal si el ataque fue contundente, pero podrá ser restablecido con cierta rapidez ya que los servidores de aplicación y de base de datos se encuentra protegidos por varias capas de seguridad y restricción.  Además podemos tener una configuración de la granja de alta disponibilidad donde contamos con redundancia en el front-end, aplication Server y una configuración de Cluster o Mirroring de lado de base de datos.  Si realizamos indagación o crawling de contenido que esta en File Server debemos de contar con protección a nivel de archivos y para ello debemos de tener instalado el producto Microsoft® Forefront® Endpoint Protection 2010 (FEP).

En este artículo vimos 3 productos que no deberían de faltar en nuestra granja de SharePoint para proteger nuestros servidores.

  • El Firewall Forefront Threat Management Gateway 2010
  • El Antivirus para el sistema de archivos Forefront Endpoint Protection 2010
  • Y el Antivirus para el contenido de SharePoint Forefront Protection 2010 for SharePoint.

Y por ultimo y no por ello menos importante el diseño de la arquitectura de la red (externa, perimetral e interna) para asegurarnos que los servicios que si deben estar expuestos están asegurados y los que no bien resguardados.

SharePoint4Fun!,

Juan Manuel Herrera O.

Referencias:

http://technet.microsoft.com/en-us/magazine/gg537286.aspx

http://social.technet.microsoft.com/Forums/en-US/FSSPNext/thread/01dda33b-16bd-42b0-85b1-3b87ffa6895b/

http://blogs.technet.com/b/forefront/

martes, 8 de febrero de 2011

Listas de SharePoint o Tablas de base de datos ?

Esta es una pregunta que nos hacemos frecuentemente cuando desarrollamos soluciones en SharePoint. 

Cada una de ellas tiene su audiencia objetivo y los problemas que resuelve también.  Así como las funcionalidades que dispone cada una de ellas.

Las listas de SharePoint fueron creadas para el usuario final y usuarios no desarrolladores que no desean ocupar mucho tiempo escribiendo código.  Con sus limitaciones en cuando a validación y funcionalidad es una forma rápida de proveer información dentro de la plataforma de SharePoint.  En 2010 esto ha mejorado tanto en la validación e integridad referencial que puede hacerse entre listas pero de todos modos se paga un precio porque no es una referencia directa como lo es una llave foránea de base de datos.

Aunque las listas de SharePoint tiene el lenguaje CAML para ejecutar consultas sobre listas es limitado y no del todo eficiente si lo comparamos con una base de datos y el lenguaje T-Sql.

En SharePoint 2010 podemos exponer las tablas de bases de datos como listas externas en SharePoint, pero de todos modos se paga un tiempo de retardo por las capas que debe de viajar la información comparado con una conexión directa hacia el proveedor de datos.

El deployment o instalación de la creación de listas en SharePoint que pueden hacerse al activar una feature o característica es sumamente fácil comparado con el proyecto de instalación de bases de datos que tendríamos que crear para instalar la base de datos además de preguntar sobre que instancia se desea instalar.

Otro tema a tomar en cuenta es la seguridad, aunque SharePoint tiene bien definida la seguridad la realidad de los portales en SharePoint es que no se tiene un plan de gobernabilidad definido que se respete y muchas personas pueden hacer de todo y esto expone las listas y los datos a cambios o exposición no deseada. 

Por ello disponer de una base de datos que la información y funcionalidades no se exponga sino a través de la solución desarrollada.

SharePoint4Fun!,

Manolo Herrera

martes, 4 de enero de 2011

Este nuevo año me trajo un nuevo y liviano contenedor de control de inversión para SharePoint

Hace algún tiempo estaba con la intención de desarrollar un IoC (Inversion of Control) o DI (Dependency Injection) para el desarrollo de elementos Web dentro de SharePoint, anteriormente lo hacía manual el acoplamiento da cada uno de los elementos, pero este descanso de fin de año me sirvió para desarrollarlo finalmente. Y estoy satisfecho de lo realizado.

Es muy liviano solo ocupa 10 Kb (Lo he publicado en codeplex para contribuir con la comunidad tecnológica y lo bautice como IoC4Fun) y consta de 2 clases el contenedor y el Registrador o TypeRegister como le llama a la clase que registra las dependencias dentro del contenedor.

Quiero agradecer a la contribución de Ken Egozi por si su artículo sobre construir un contenedor en 33 líneas en 15 minutos me sirvió de ayuda para desarrollar mi propio contendedor de inyección de dependencia. 

A diferencia de Ken le invertí un poco de mas de 15 minutos y el resultado fue una herramienta muy liviana, que hace lo necesario y no estoy pegado a ninguna plataforma o framework fuera del .Net framework 3.5. 

A continuación enumeraré las funcionalidades que fluí agregando:

En vez de utilizar un diccionario para registrar los tipos, utilice una lista genérica de tipo TypeRegister.

Agregue la funcionalidad para localizar las propiedades y no solo parámetros del constructo y que resolviera las dependencias basado en parámetros definidos al momento de ser registrados.

image

Agregue la opción Share para compartir la misma instancia entre dependencias.

image

Que el contenedor aceptara una la instancia de una clase ya creada en memoria necesaria para aplicar el patrón Passive View al momento de inyectar la instancia de la página en el presentador.

image

Y por último agregué la opción para no buscar ninguna dependencia (DisposeAll) o que permitiera dependencias nulas por si una propiedad no fuese requerida o es parte de la lógica de la clase que la contiene (AllowNull).

image

Al final tenemos una resultado elegante, práctico y fácil de implementar:

image

Algo que me agrado fue que no agregue código intrusivo a las dependencias aunque con sus respectivas limitaciones que no afectan para las soluciones que desarrollo como la limitación de solo tener un constructor para que sepa como resolverlo el contenedor.  Pero gané un código muy limpio como muestro en la imagen de abajo:

image

Otra buena funcionalidad fue revisar que no se registrará mas de una vez un los mismos tipos, a través de Linq fue algo muy sencillo.

image

y la posibilidad de definir diferentes implementaciones de una misma interfaz como el caso del Logger en el ejemplo:

image

Bueno amigo lector le pido viste codeplex el proyecto IoC4Fun y hágame llegar sus comentarios.

Contribute4Fun!,

Manolo Herrera

martes, 30 de noviembre de 2010

Managed Extensibility FrameWork (Presentación y Ejemplos)

Estimados para los que preguntaron sobre la presentación de MEF y ejemplos que pueden interesarles pueden obtenerlos en el siguiente link:

http://cid-a548d755baaa8510.office.live.com/browse.aspx/P%c3%bablico?uc=2

Descargo de responsabilidad: 

La presentación aunque es original, las fuentes también fueron tomadas de presentaciones de otros autores, y adaptadas y traducidas al español para la audiencia guatemalteca.

MEF4Fun!,

Manolo Herrera

sábado, 6 de noviembre de 2010

Charla: Extiende tus aplicaciones facilmente con Managed Extensibility FrameWork de .Net Framework 4.0

 

Si te gusto Unity Application Block espera a usar MEF que no solo es un IoC sino un Framework que te permitirá extender tus aplicaciones en vivo muy fácil y naturalmente y esta incluida en el Net Framework 4.0..

Estaré compartiendo en las oficinas de Microsoft en Guatemala sobre "MEF (Managed Extensibility Framework)", no te lo pierdas te dejo con la información de la invitación que puedes verla en EventBrite:

http://eventomefcomunidad.eventbrite.com

A sugerencia de algunos miembros que nos han solicitado postear links referentes al tema que se presentará para poder estudiar un poco antes de la reunión les compartimos las siguientes referencias:

Sitio oficial del producto: http://mef.codeplex.com/ (aquí podrán encontrar referencias, videos, etc.)

Blog de Glenn Block: http://blogs.msdn.com/b/gblock (El padre de la criatura).

NO TE LO PIERDAS !!!!

TE ESPERAMOS!!!!

Datos:

  • Fecha: Jueves 11 de Noviembre de 2010
  • Hora: De 6:30pm a 8:30pm
  • Lugar Oficinas de Microsoft de Guatemala
  • Dirección: 14 calle 2-51 zona 10, Edificio Intercontinental Nivel 11 Oficina 1101
  • Precio: ¡¡Gratis!!
  • Habrá premios por participación!

Nos vemos por allá!,

Manolo Herrera/

miércoles, 21 de julio de 2010

Cómo aplicar correctamente el Patrón Passive View a una colección de elementos para un elemento Web de SharePoint

Anteriormente publique como aplicar un Patrón Passive View al desarrollo en Web específicamente a los elementos Web, pero explicaba que no encontraba la forma de pasar una colección de elementos sin pasar la entidad del negocio, en este artículo describiré como hacerlo.

Publicación anterior: http://jmhogua.blogspot.com/2010/05/aplicando-el-patron-passive-view-en-un.html

El patrón Passive View indica que la Vista es tonta que toda la lógica de la vista debe de manejarse del lado del presentador y que solo el presentador conoce el dominio y la vista no sabe nada de el.

Que hacer sino queremos exponer algo como lo que sigue:

La interfaz de la Vista

image

La interfaz implementada en la Vista

image 

El Presentador inyectando la colección de Tareas

image Si quiere saber cómo se inyecta la vista en el presentador vea el artículo anterior.

En el ejemplo anterior el Conocimiento de la colección de la Entidad de Tareas es conocido tanto para la Vista como el presentador, ahora veamos como se resuelve esto para que la visa no sepa nada o casi nada sobre el tipo de colección que esta recibiendo.

La interfaz la declararíamos de la siguiente forma:

image

La interfaz implementada en la Vista luciría de la siguiente forma:

image

El presentador No varia, de esta forma la vista sabe menos del dominio ya que recibe cualquier colección que implementa IEnumerable que es un estándar de las colección en .NET.

Espero te haya gustado mi solución, Code4Fun!,

Manolo Herrera

jueves, 15 de julio de 2010

Creando mas de una base de datos de contenido para una aplicación Web en SharePoint

Una colección de sitios vive dentro de una aplicación Web en SharePoint y esta es almacenada en una base de datos.  Pero podemos definir mas de una colección de sitios dentro una aplicación Web, e inclusive definir la nueva colección de sitios dentro de otra base de datos.   

Para qué hacer esto?.  Bueno según la recomendación de Microsoft para SharePoint 2007 una base de datos de contenido que se utilice como colaboración mas que una forma de archivar documentación no debería ser mayor a 100 Gb para garantizar el rendimiento del sitio.  Y para SharePoint 2010 se sugiere 200 Gb por base de datos. Puede utilizarse hasta 1 Tb de espacio para un centro de registros pero no para un ambiente colaborativo.

Una colección de sitios también delimita entre otras cosas los grupos.  Los grupos se definen a nivel de colección de sitios esto quiere decir que estos grupos no se encontrarán en otra colección de sitios, no importa donde creemos los grupos estos estarán disponibles dentro de toda la colección de sitios.

image (Acciones del sitio, configuración del sitio, Personas y Grupos).

Las colecciones de sitios solo pueden ser creadas desde la Administración Central, dentro de Administración de Aplicaciones, como se muestra en la imagen de abajo.

image

image (Se debe de seleccionar la aplicación web donde se va a crear.  Si ya esta creada la colección de sitios de la raíz, sugerirá una ruta para crear la nueva colección y la raíz de esta nueva colección de sitios será por ejemplo: http://servername/sites/NuevaColeccionSitios/

Para crear una nueva colección de sitios en una diferente base de datos debería seguir los siguientes pasos:

En la Administración Central, en Administración de aplicaciones, seleccionar Base de datos de contenido.

image

Le listará la base de datos de contenido de la aplicación seleccionada, en la imagen de abajo hay dos creadas y vamos a crear una tercera, usualmente le aparece solo una.

image Haga clic sobre la opción  “Agregar una base de datos de contenido”.

image

1) Verifique que es la aplicación correcta donde va asociar la nueva base de datos de contenido.

2) El servidor de base de datos debería ser el mismo.

3) El nombre de la base de datos podrá cambiarlo a algo mas descriptivo como por ejemplo: WS_Content_Departamento_Finanzas o WSS_Content_Documentacion.

4) Recomendado utilice la autenticación por Windows con la que se instaló SharePoint.

5) Por ultimo presione el botón de Aceptar.

image

Ahora, para acceder a la nueva base de datos lo hacemos a través de la colección de sitios, para ello debemos de crear la colección de Sitios que se creará en la base de datos ultima de contenido creada.  Regresemos entonces dentro de la administración central a Administración de colección de sitios, Crear Colección de Sitios.

image

Cree la colección como lo hace normalmente.  Especifique El título, descripción, URL, Plantilla, Administradores de sitios y especifíquele una cuota si desea. Finalice presionando el botón de Aceptar.

Para ver donde fue creada esta colección de sitios seleccione la opción Lista de Colección de Sitios dentro de la administración de aplicaciones.

image

Si desea restringir el crecimiento tamaño de alguna colección de sitios, siempre en la administración de aplicaciones, Bloqueos y cuotas de colección de sitios.

image

image La imagen por si sola se explica, aplique una plantilla o defina un valor máximo y de advertencia.  Presione el botón Aceptar y listo.

En este artículo vimos como crear mas de una base de datos de contenido por aplicación Web. Útil para organizaciones que exceden la recomendación de Microsoft para un ambiente colaborativo para una respuesta optima de las operaciones que realiza en un portal de colaboración.

SharePoint4Fun!,

Manolo Herrera

miércoles, 26 de mayo de 2010

Aplicando el patrón Passive View en un elemento Web en SharePoint - Parte II

En esta segunda parte (aquí la Primera parte) vamos a revisar el  Patrón Passive View aplicado al mismo elemento Web de la primera parte para que vea el cambio y como es este patrón una alternativa para tener un código mucho mas limpio y por ende mucho mas fácil de modificar o adaptar.

Passive View es una variación del popular patrón Model View Presenter.  Básicamente tenemos una vista tonta que lo único que sabe es mostrar la información toda la lógica de la vista esta en el presentador (o controlador) y este es el único que puede acceder el modelo. 

Aclaraciones:

En el siguiente código de ejemplo transfiero DTO’s a la vista para que la vista se encargue en el caso de una colección del binding .   No creo que este rompiendo el patrón por hacer esto, no encontré en la red ningún ejemplo que resolviera esto adecuadamente y no creo tampoco que el que la vista conozca un DTO este conociendo el modelo, simplemente es una forma muy practica de enlazar la data. Mas adelante muestro el ejemplo para que se comprenda mas este punto.

 

Infraestructura:

    1. Virtual Machine Windows Server 2003
    2. SQL Server 2005 Std Edition
    3. SharePoint Server 2007
    4. Visual Studio 2008 SP1
    5. WSPBuilder (para construir soluciones para SharePoint)

Empecemos:

Primero vamos a crear un elemento Web para SharePoint la herramienta a utilizar WSPBuilder, le vamos a llamar EditarTarea.

image

Luego crear un control de Usuario como la parte visual donde mostremos los controles de usuario (vea Primera parte).

image

Luego vamos a crear la interfase que representará la vista en el presentador inicialmente nos vamos a concentrar en como amarrar la vista con el control de usuario y el presentador.

La vista:

image .

La inyección de la vista en el presentador:

image

La implementación de la interfase en el control de usuario:

image

Continuamos ahora con los eventos declarándolos en la vista ya que es lo único que el presentador conoce de la vista

image

En el control de usuario implementamos dicha declaración amarrándolos con los eventos de los controles de usuario.

image

Ahora veamos como suscribimos los eventos en el presentador

image

La lógica de los eventos se define en el presentador, veamos algunos ejemplos:

image

Ahora vamos a ver las propiedades de la vista

image

Su implementación en el control de usuario

image

image

image

image

Su uso en el presentador es muy variado y dependerá de la lógica observe el siguiente ejemplo:

image

La meta en el presentador es mantener únicamente la lógica de la vista y separar las responsabilidades tanto de la vista como del modelo de tal forma que no tengamos dependencia de ninguna tecnología Web o de proveedor de datos. Esto lo podemos validar revisando los espacios de nombre utilizados en el presentador.  Como se  muestra abajo los usings del presentador:

image

Esto quiere decir que hemos encapsulado las referencias en el modelo o en la vista.  Cualquier cosa que necesitemos deberemos de invocarlo a través de propiedades, eventos y métodos a la vista o hacia el modelo. 

En el presentador hacemos la invocación de las dependencias hacia el modelo como lo muestro a continuación:

image

Revisemos algunas de sus dependencias como ha sido implementadas:

image

image

Como inicio la escritura del patrón de la siguiente forma:

  1. Creo el elemento Web con WSPBuilder en Visual Studio.
  2. Creo el control de usuario y desarrollo la parte visual.
  3. Finalizada la parte visual defino una Interfase que representa el control de usuario que finaliza con el sufijo Vista.
  4. Creo una clase con sufijo Presentador y coloco como parámetro la interfase de la vista para que sea inyectado definiendo un campo privado que representa la vista
  5. Implemento la vista en el control de usuario e inyectando la vista en el presentador en el evento OnInit().
  6. Luego empiezo declarando todos los eventos que me interesan atrapar del control usuario en la interfase de la vista e implementándolos en el control de usuario y en el presentador
  7. Continuo con las propiedades base que será los valores capturados por el usuario dentro de los controles.
  8. Inicio la lógica en el presentador y esto me va llevando a crear una nueva propiedad en la vista o a invocar el modelo definiendo interfaces y su implementación correspondiente encapsulando ésta responsabilidad en un servicio y repositorio. 

Resumen

El propósito de aplicar este patrón en nuestro desarrollo para elementos Web en SharePoint es fundamentalmente para mantener un código limpio que se traduce en una mejor lectura y comprensión del mismo para su mantenibilidad y que esta listo para ser probado ya que están bien separadas las responsabilidades.

Una vez comprendida las responsabilidades de cada uno de los actores dentro del patrón es mecánico el proceso de su codificación y no es para nada complicado.

Code4Fun!,

Manolo Herrera