sábado, 30 de agosto de 2008

Windsor Container Part. I

Introducción.
Windsor Container es un "Inversion of Control Container" que forma parte del conjunto de soluciones open source de Castle Project junto a Monorail, Active Record y MicroKernel.

Pero vayamos por partes. Antes de explicar que es Windsor Container deberiamos saber que es la "Inversion of Control" (IoC). Este es un concepto muy poco extendido en el mundo .NET, y a aún menos utilizado, debido principalmente a la elevada curva de aprendizaje para su utilización en un desarrollo.
La idea básica de la IoC es que sea el framework quien realice la invocación a los objectos hechos por los programadores y no al revés, lo que implica que es el framework quien tiene el control de los objectos que se invocan y no nosotros. Windsor Container es un contenedor de objectos que utiliza el principio IoC para crear los objectos de las clases y sus dependencias. Esto reduce el acoplamiento del sistema, facilita el reuso de los objetos, el testeo y la realización de refactoring.

Como utilizar Windsor Container.
Como toma de contacto con Windsor Container escribiremos una clase muy sencilla, la clase Sumador, que como su nombre indica su objectivo es sumar dos numeros:
public class Sumador { public decimal Suma(decimal num1, decimal num2) { return num1 + num2; } }
Sin Windsor Container(WC) para utilizar esta clase escribiriamos código de este tipo:
... public static void Main(string[] args) { var sumador = new Sumador(); var result = sumador.Suma(1,1); } ...
Al utilizar WC ya que los objetos se encuentran en un contenedor, no debemos instanciar nosotros los objectos sino que debemos pedirselos al contenedor. Primero debemos construir el contenedor, este se creará a partir de un fichero xml de configuración, que explicaremos más abajo. Una vez nuestro contenedor ya ha sido creado, pedimos al contenedor un objeto de tipo Sumador y por último lo utilizamos.
... public static WindsorContainer miContenedor; public static void Main(string[] args) { //Creamos el contenedor miContenedor = new WindsorContainer (new XmlInterpreter("MiContenedor.xml")); //Pedimos un objeto de tipo sumador al contenedor var sumador = miContenedor.Resolve<Sumador>(); var result = sumador.Suma(1,1); } ...
Como vemos el contenedor debe ser una variable estática con el fin de utilizar siempre el mismo contenedor durante todo el ciclo de vida de la aplición. No tendría sentido ir creado un contenedor cada vez que tenemos que crear un objeto. El fichero de configuración de WC es un fichero xml en el que se especifican todos los objetos que están incluidos en el contenedor. Este fichero tiene el siguiente formato:
<configuration> <components> <component id="Sumador" type="IoC.Tutoriales.Part1.Sumador, IoC.Tutoriales.Part1" /> </components> </configuration>
Los objectos a incluir se especifican mediante el tag "component" (incluido dentro de components), para cada componente hay que definir un identificador único (id) dentro del contenedor y el tipo de clase del objeto a la que pertenece (type ="nombre de clase, nombre del assembly"). Esta configuración se puede incluir dentro del App.config, aunque mi consejo es que esté en un fichero a parte, ya que lo ficheros de configuración xml de windsor son suceptibles de hacerse muy grandes y de ser modifcados habitualmente. Espero que os sirva de ayuda esta pequeña introducción al mundo IoC, en los siguientes artículos sobre IoC explicaremos cosas más interesantes que seguro serán de más utilidad. El código de ejemplo de este tutorial se encuentra en este link.