<?xml version='1.0' encoding='UTF-8'?><?xml-stylesheet href="http://www.blogger.com/styles/atom.css" type="text/css"?><feed xmlns='http://www.w3.org/2005/Atom' xmlns:openSearch='http://a9.com/-/spec/opensearchrss/1.0/' xmlns:georss='http://www.georss.org/georss' xmlns:gd='http://schemas.google.com/g/2005' xmlns:thr='http://purl.org/syndication/thread/1.0'><id>tag:blogger.com,1999:blog-8091076182394048623</id><updated>2011-11-28T00:46:06.065+01:00</updated><category term='linux'/><category term='NUnit'/><category term='ubuntu'/><category term='mono'/><category term='Rhino Mocks'/><category term='Inversion of Control'/><category term='IoC'/><category term='Unit Test'/><category term='Windsor Container'/><category term='Windsor'/><category term='Castle Project'/><category term='Container'/><title type='text'>Dot NET Spanish</title><subtitle type='html'></subtitle><link rel='http://schemas.google.com/g/2005#feed' type='application/atom+xml' href='http://dotnetspanish.blogspot.com/feeds/posts/default'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8091076182394048623/posts/default?max-results=100'/><link rel='alternate' type='text/html' href='http://dotnetspanish.blogspot.com/'/><link rel='hub' href='http://pubsubhubbub.appspot.com/'/><author><name>Sergio Bermudez</name><uri>http://www.blogger.com/profile/06107182130049911112</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><generator version='7.00' uri='http://www.blogger.com'>Blogger</generator><openSearch:totalResults>5</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>100</openSearch:itemsPerPage><entry><id>tag:blogger.com,1999:blog-8091076182394048623.post-2193305734053469379</id><published>2010-05-10T22:34:00.002+02:00</published><updated>2010-05-10T22:36:50.237+02:00</updated><title type='text'>Cambio de Blog</title><content type='html'>Hola a todos.
Recientemente he cambiado este blog a un nuevo espacio: &lt;a href="http://www.thedotsharper.es/"&gt;www.thedotsharper.es&lt;/a&gt;.

Espero que sea de vuestro agrado.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8091076182394048623-2193305734053469379?l=dotnetspanish.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://dotnetspanish.blogspot.com/feeds/2193305734053469379/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://dotnetspanish.blogspot.com/2010/05/cambio-de-blog.html#comment-form' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8091076182394048623/posts/default/2193305734053469379'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8091076182394048623/posts/default/2193305734053469379'/><link rel='alternate' type='text/html' href='http://dotnetspanish.blogspot.com/2010/05/cambio-de-blog.html' title='Cambio de Blog'/><author><name>Sergio Bermudez</name><uri>http://www.blogger.com/profile/06107182130049911112</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8091076182394048623.post-2613383106558271358</id><published>2009-05-18T16:11:00.005+02:00</published><updated>2009-08-03T11:46:03.723+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='linux'/><category scheme='http://www.blogger.com/atom/ns#' term='mono'/><category scheme='http://www.blogger.com/atom/ns#' term='ubuntu'/><title type='text'>Instalando Mono2.4 en Ubuntu</title><content type='html'>&lt;span style="font-family:arial;font-size:85%;"&gt;Hac&amp;iacute;a mucho tiempo que no escrib&amp;iacute;a, y en parte es porque he tenido una crisis tecnol&amp;oacute;gica,
provocada por una temporada de programaci&amp;oacute;n en Silverlight 2.0.&lt;BR&gt;
No voy a entrar en detalles pero para que os haga&amp;iacute;s una idea s&amp;oacute;lo os dir&amp;eacute; que echaba de menos la programaci&amp;oacute;n en el Cobol Microfocus con Dialog System, prefer&amp;iacute;a el Cobol antes que seguir programando en el bicho ese.&lt;BR&gt;
Me sent&amp;iacute;a como el señor Fuckowski en el Proyecto Porsche, intentando hacer un Porsche de una bicicleta, con un destornillador y cubo de pintura.&lt;BR&gt;
Resumiendo, Silverlight es eso un destornillador, un cubo de pintura, y una pregunta : &lt;BR&gt;¿A qui&amp;eacute;n c...o se le ha ocurrido sacar esto al mercado?&lt;BR&gt;
No negar&amp;eacute; que en mis sueños lo he estrangulado varios "cienes y cienes" de veces.&lt;BR&gt;
Pero como nunca llueve eternamente, un d&amp;iacute;a descubr&amp;iacute; algo que llamo mi atenci&amp;oacute;n: ¿qu&amp;eacute; cosa es esa de un Runtime compatible con .NET, que se programa en C# y que se ejecuta en cualquier plataforma?&lt;BR&gt;
No me podr&amp;eacute;is negar que a priori no es interensate, por suerte para nosotros ese Runtime existe y se llama&lt;a href='http://www.mono-project.com' target='blank'&gt;Mono&lt;/a&gt;.&lt;BR&gt;
Como no ten&amp;iacute;a ni idea, pues empec&amp;eacute; por el principio, me instal&amp;eacute; Ubuntu en una m&amp;aacute;quina virtual. No me cost&amp;oacute; mucho tiempo acostumbrarme al Ubuntu, la verdad es que acostumbrarte a un sistema operativo, que no tarda tres telediarios en abrir un explorador de carpertas, no cuesta.&lt;br&gt;
As&amp;iacute; que con un poco de paciencia y con el tito Google, pronto aprend&amp;iacute; a utilizar un poquito un sistema operativo con cara y ojos. Mi siguiente paso fue instalar la &amp;uacute;ltima versi&amp;oacute; de Mono, Ubuntu trae una versi&amp;oacute;n pero no es la &amp;uacute;ltima.&lt;br&gt;
A continuaci&amp;oacute; explicaremos como instalar Mono 2.4 en Ubuntu 9.04.&lt;/span&gt;&lt;BR&gt;
&lt;br&gt;
&lt;span style="font-weight: bold;font-family:arial;font-size:130%;"&gt;1. Instalado los prerequisitos.&lt;/span&gt;&lt;br&gt;&lt;br&gt;
&lt;span style="font-family:arial;font-size:85%;"&gt;
Primero necesitamos configurar la herramientas para compilar el c&amp;oacute;digo fuente. Estas se puede instalar desde el Synaptic o bien desde la consola.&lt;br&gt;

Abrimos una consola y escribimos los siguiente para instalar el software  y las cabeceras necesarias para la compilaci&amp;oacute;n.
&lt;/span&gt;
&lt;br&gt;&lt;br&gt;
&lt;div style="font-family:'Courier New';font-size: 9pt;white-space: pre;line-height: 1;font-size:85%;border:1px solid #000;background-color:#ececec;width:100%;padding-left:10px;"&gt;
sergiob@sergiob-mono:~$ sudo apt-get update
sergiob@sergiob-mono:~$ sudo apt-get install build-essential autoconf automake \
bison flex gtk-sharp2-gapi boo gdb valac libfontconfig1-dev \
libcairo2-dev libpango1.0-dev libfreetype6-dev libexif-dev \
libjpeg62-dev libtiff4-dev libgif-dev zlib1g-dev libatk1.0-dev \
libglib2.0-dev libgtk2.0-dev libglade2-dev libart-2.0-dev \
libgnomevfs2-dev libgnome-desktop-dev libgnome2-dev libgnomecanvas2-dev \
libgnomeui-dev libgnomeprint2.2-dev libgnomeprintui2.2-dev \
libpanel-applet2-dev libnautilus-burn-dev librsvg2-dev \
libgtkhtml3.14-dev libgtksourceview2.0-dev libgtksourceview-dev \
libvte-dev libwnck-dev libnspr4-dev libnss3-dev libxul-dev \
libwebkit-dev libvala-dev&lt;Br&gt;
&lt;/div&gt;
&lt;br&gt;
&lt;span style="font-weight: bold;font-family:arial;font-size:130%;"&gt;2. Descargar los fuentes de Mono.&lt;/span&gt;&lt;br&gt;
&lt;span style="font-family:arial;font-size:85%;"&gt;
De &lt;a href='http://www.mono-project.com' target='blank'&gt;Mono Project&lt;/a&gt; nos descargaremos los siguientes archivos fuentes, 
en el ftp encontrar&amp;eacute;is m&amp;aacute;s pero no es necesario que los descarg&amp;eacute;is todos.&lt;br&gt;&lt;br&gt;
&lt;/span&gt;
&lt;div style="font-family:'Courier New';font-size: 9pt;white-space: pre;line-height: 1;font-size:85%;border:1px solid #000;background-color:#ececec;width:100%;padding-left:10px;"&gt;
mono-2.4.tar.bz2&lt;Br&gt;
libgdiplus-2.4.tar.bz2&lt;Br&gt;
gluezilla-2.4.tar.bz2&lt;Br&gt;
xsp-2.4.tar.bz2&lt;Br&gt;
mono-tools-2.4.tar.bz2&lt;Br&gt;
gecko-sharp-2.0-0.13.tar.bz2&lt;Br&gt;
mono-debugger-2.4.tar.bz2&lt;Br&gt;
mono-addins-0.4.zip&lt;Br&gt;
gtk-sharp-2.12.8.tar.bz2&lt;Br&gt;
gnome-sharp-2.20.1.tar.bz2&lt;Br&gt;
gnome-desktop-sharp-2.20.1.tar.bz2&lt;Br&gt;
webkit-sharp-0.2.tar.bz2&lt;Br&gt;
&lt;/div&gt;
&lt;br&gt;
&lt;span style="font-family:arial;font-size:85%;"&gt;
A continuaci&amp;oacute;n descargaremos los fuentes de &lt;a href='http://monodevelop.com/' target='blank'&gt;Monodevelop 2.0&lt;/a&gt;&lt;br&gt;
&lt;/span&gt;
&lt;br&gt;
&lt;div style="font-family:'Courier New';font-size: 9pt;white-space: pre;line-height: 1;font-size:85%;border:1px solid #000;background-color:#ececec;width:100%;padding-left:10px;"&gt;
monodevelop-2.0&lt;br&gt;
monodevelop-debugger-mdb-2.0&lt;br&gt;
monodevelop-debugger-gdb-2.0&lt;br&gt;
monodevelop-database-2.0&lt;br&gt;
monodevelop-java-2.0&lt;br&gt;
monodevelop-vala-2.0&lt;br&gt;
&lt;/div&gt;
&lt;br&gt;
&lt;span style="font-family:arial;font-size:85%;"&gt;
Ahora ya s&amp;oacute;lo nos queda extraer los fuentes de los ficheros que hemos descargado en un direcotorio, por ejemplo src/mono-2.4&lt;br&gt;
&lt;/span&gt;
&lt;br&gt;
&lt;div style="font-family:'Courier New';font-size: 9pt;white-space: pre;line-height: 1;font-size:85%;border:1px solid #000;background-color:#ececec;width:100%;padding-left:10px;"&gt;
sergiob@sergiob-mono:~$ mkdir -p src/mono-2.4; cd src/mono-2.4&lt;br&gt;
&lt;/div&gt;
&lt;br&gt;
&lt;span style="font-family:arial;font-size:85%;"&gt;
Extraemos todos los archivos en este directorio.&lt;br&gt;
&lt;/span&gt;
&lt;br&gt;
&lt;span style="font-weight: bold;font-family:arial;font-size:130%;"&gt;3. Instalar libgdiplus.&lt;/span&gt;&lt;br&gt;&lt;br&gt;
&lt;span style="font-family:arial;font-size:85%;"&gt;
Antes de compilar el fuente de mono tenemos que compilar libgdiplus para poder tener una implementaci&amp;oacute;n de System.Drawing.&lt;br&gt;
&lt;/span&gt;
&lt;br&gt;
&lt;div style="font-family:'Courier New';font-size: 9pt;white-space: pre;line-height: 1;font-size:85%;border:1px solid #000;background-color:#ececec;width:100%;padding-left:10px;"&gt;
sergiob@sergiob-mono:~$ cd libgdiplus-2.4&lt;br&gt;
sergiob@sergiob-mono:~/src/mono-2.4/libgdiplus-2.4$ ./configure --with-pango&lt;br&gt;
&lt;/div&gt;
&lt;br&gt;
&lt;span style="font-family:arial;font-size:85%;"&gt;
Si la configuraci&amp;oacute;n a funcionado correctamente nos aparecer&amp;aacute; algo como esto.&lt;br&gt;
&lt;/span&gt;
&lt;br&gt;
&lt;div style="font-family:'Courier New';font-size: 9pt;white-space: pre;line-height: 1;font-size:85%;border:1px solid #000;background-color:#ececec;width:100%;padding-left:10px;"&gt;
---
Configuration summary

   * Installation prefix = /usr/local
   * Cairo = 1.8.6 (system)
   * Text = pango
   * EXIF tags = yes
   * Codecs supported:

      - TIFF: yes
      - JPEG: yes
      - GIF: yes
      - PNG: yes
      NOTE: if any of the above say 'no' you may install the
            corresponding development packages for them, rerun
            autogen.sh to include them in the build.

---
&lt;/div&gt;
&lt;span style="font-family:arial;font-size:85%;"&gt;
Si no es as&amp;iacute; y nos falta alguna dependencia podemos usar Synaptic para instalar el paquete.&lt;br&gt;
&lt;br&gt;
Ahora ya podemos compilar e instalar el fuente.
&lt;/span&gt;
&lt;div style="font-family:'Courier New';font-size: 9pt;white-space: pre;line-height: 1;font-size:85%;border:1px solid #000;background-color:#ececec;width:100%;padding-left:10px;"&gt;
sergiob@sergiob-mono:~/src/mono-2.4/libgdiplus-2.4$ make&lt;br&gt;
sergiob@sergiob-mono:~/src/mono-2.4/libgdiplus-2.4$ sudo make install&lt;BR&gt;
&lt;/div&gt;
&lt;br&gt;
&lt;span style="font-weight: bold;font-family:arial;font-size:130%;"&gt;4. Instalar mono-2.4.&lt;/span&gt;&lt;br&gt;&lt;br&gt;
&lt;span style="font-family:arial;font-size:85%;"&gt;
Ha llegado el momento de compilar Mono, esto producir&amp;aacute; los compiladores de C# y el Framwork de Mono, vamos manos a la obra.&lt;br&gt;
&lt;/span&gt;
&lt;br&gt;
&lt;div style="font-family:'Courier New';font-size: 9pt;white-space: pre;line-height: 1;font-size:85%;border:1px solid #000;background-color:#ececec;width:100%;padding-left:10px;"&gt;
sergiob@sergiob-mono:~/src/mono-2.4/mono-2.4$ ./configure&lt;br&gt;
sergiob@sergiob-mono:~/src/mono-2.4/mono-2.4$ make&lt;br&gt;
sergiob@sergiob-mono:~/src/mono-2.4/mono-2.4$ sudo make install&lt;br&gt;
&lt;/div&gt;
&lt;br&gt;
&lt;div style="font-family:'Courier New';font-size: 9pt;white-space: pre;line-height: 1;font-size:85%;border:1px solid #000;background-color:#ececec;width:100%;padding-left:10px;"&gt;
sergiob@sergiob-mono:~/src/mono-2.4/mono-2.4$ mono --version
Mono JIT compiler version 2.4 (tarball lun may 18 13:20:54 CEST 2009)
Copyright (C) 2002-2008 Novell, Inc and Contributors. www.mono-project.com
 TLS:           __thread
 GC:            Included Boehm (with typed GC)
 SIGSEGV:       altstack
 Notifications: epoll
 Architecture:  x86
 Disabled:      none&lt;br&gt;
&lt;/div&gt;
&lt;br&gt;
&lt;span style="font-weight: bold;font-family:arial;font-size:130%;"&gt;5. Gtk+ y Gnome.&lt;/span&gt;&lt;br&gt;&lt;br&gt;
&lt;span style="font-family:arial;font-size:85%;"&gt;
A continuaci&amp;oacute;n instalaremos las librerias necesarias para las aplicaciones de escritorio,
gtk-sharp, gnome-sharp, gnome-desktop-sharp, gtksourceview-sharp.&lt;br&gt;
&lt;/span&gt;
&lt;br&gt;
&lt;div style="font-family:'Courier New';font-size: 9pt;white-space: pre;line-height: 1;font-size:85%;border:1px solid #000;background-color:#ececec;width:100%;padding-left:10px;"&gt;
sergiob@sergiob-mono:~/src/mono-2.4/gtk-sharp-2.12.8$ ./configure&lt;br&gt;
sergiob@sergiob-mono:~/src/mono-2.4/gtk-sharp-2.12.8$ make&lt;br&gt;
sergiob@sergiob-mono:~/src/mono-2.4/gtk-sharp-2.12.8$ sudo make install&lt;br&gt;
sergiob@sergiob-mono:~/src/mono-2.4/gnome-sharp-2.20.1$ ./configure&lt;br&gt;
sergiob@sergiob-mono:~/src/mono-2.4/gnome-sharp-2.20.1$ make&lt;br&gt;
sergiob@sergiob-mono:~/src/mono-2.4/gnome-sharp-2.20.1$ sudo make install&lt;br&gt;
sergiob@sergiob-mono:~/src/mono-2.4/gnome-desktop-sharp-2.20.1$ ./configure&lt;br&gt;
sergiob@sergiob-mono:~/src/mono-2.4/gnome-desktop-sharp-2.20.1$ make&lt;br&gt;
sergiob@sergiob-mono:~/src/mono-2.4/gnome-desktop-sharp-2.20.1$ sudo make install&lt;br&gt;
sergiob@sergiob-mono:~/src/mono-2.4/gtksourceview-sharp-2.0-0.12$ ./configure&lt;br&gt;
sergiob@sergiob-mono:~/src/mono-2.4/gtksourceview-sharp-2.0-0.12$ make&lt;br&gt;
sergiob@sergiob-mono:~/src/mono-2.4/gtksourceview-sharp-2.0-0.12$ sudo make install&lt;br&gt;
&lt;/div&gt;
&lt;br&gt;
&lt;span style="font-weight: bold;font-family:arial;font-size:130%;"&gt;6. Gluezilla, Gecko-Sharp y Webkit-Sharp.&lt;/span&gt;&lt;br&gt;&lt;br&gt;
&lt;br&gt;
&lt;div style="font-family:'Courier New';font-size: 9pt;white-space: pre;line-height: 1;font-size:85%;border:1px solid #000;background-color:#ececec;width:100%;padding-left:10px;"&gt;
sergiob@sergiob-mono:~/src/mono-2.4/gluezilla-2.4$ ./configure&lt;br&gt;
sergiob@sergiob-mono:~/src/mono-2.4/gluezilla-2.4$ make&lt;br&gt;
sergiob@sergiob-mono:~/src/mono-2.4/gluezilla-2.4$ sudo make install&lt;br&gt;
sergiob@sergiob-mono:~/src/mono-2.4/gecko-sharp-2.0-0.13$ ./configure&lt;br&gt;
sergiob@sergiob-mono:~/src/mono-2.4/gecko-sharp-2.0-0.13$ make&lt;br&gt;
sergiob@sergiob-mono:~/src/mono-2.4/gecko-sharp-2.0-0.13$ sudo make install&lt;br&gt;
sergiob@sergiob-mono:~/src/mono-2.4/webkit-sharp-0.2$ ./configure&lt;br&gt;
sergiob@sergiob-mono:~/src/mono-2.4/webkit-sharp-0.2$ make&lt;br&gt;
sergiob@sergiob-mono:~/src/mono-2.4/webkit-sharp-0.2$ sudo make install&lt;br&gt;
&lt;/div&gt;
&lt;br&gt;
&lt;span style="font-weight: bold;font-family:arial;font-size:130%;"&gt;7. Mono-Addins, Mono-Tools.&lt;/span&gt;&lt;br&gt;&lt;br&gt;
&lt;span style="font-family:arial;font-size:85%;"&gt;
Ahora instalaremos los addins y la colección de herramientas de Mono que incluyen Gendarme y GSharp(consola de C#).
&lt;/span&gt;
&lt;br&gt;
&lt;div style="font-family:'Courier New';font-size: 9pt;white-space: pre;line-height: 1;font-size:85%;border:1px solid #000;background-color:#ececec;width:100%;padding-left:10px;"&gt;
sergiob@sergiob-mono:~/src/mono-2.4/mono-addins-0.4$ ./configure&lt;br&gt;
sergiob@sergiob-mono:~/src/mono-2.4/mono-addins-0.4$ make&lt;br&gt;
sergiob@sergiob-mono:~/src/mono-2.4/mono-addins-0.4$ sudo make install&lt;br&gt;
sergiob@sergiob-mono:~/src/mono-2.4/mono-tools-2.4$ ./configure&lt;br&gt;
sergiob@sergiob-mono:~/src/mono-2.4/mono-tools-2.4$ make&lt;br&gt;
sergiob@sergiob-mono:~/src/mono-2.4/mono-tools-2.4$ sudo make install&lt;br&gt;
&lt;/div&gt;
&lt;br&gt;
&lt;span style="font-family:arial;font-size:85%;"&gt;
Para comprobar que las herramientas se ha instalado podemos realizar el siguiente test, en el que aparecera la consola de C#.
&lt;/span&gt;
&lt;br&gt;
&lt;div style="font-family:'Courier New';font-size: 9pt;white-space: pre;line-height: 1;font-size:85%;border:1px solid #000;background-color:#ececec;width:100%;padding-left:10px;"&gt;
sergiob@sergiob-mono:~$ gsharp&lt;br&gt;
&lt;/div&gt;
&lt;br&gt;
&lt;span style="font-weight: bold;font-family:arial;font-size:130%;"&gt;8. Mono XSP y Mono Debugger.&lt;/span&gt;&lt;br&gt;&lt;br&gt;
&lt;span style="font-family:arial;font-size:85%;"&gt;
Por &amp;uacute;ltimo, antes de instalar MonoDevelop, instalaremos XSP, que es un web server desarrollado en C#. Y el Debugger que nos permitir&amp;aacute; depurar el c&amp;oacute;digo escrito.
&lt;/span&gt;
&lt;br&gt;
&lt;div style="font-family:'Courier New';font-size: 9pt;white-space: pre;line-height: 1;font-size:85%;border:1px solid #000;background-color:#ececec;width:100%;padding-left:10px;"&gt;
sergiob@sergiob-mono:~/src/mono-2.4/xsp-2.4$ ./configure&lt;br&gt;
sergiob@sergiob-mono:~/src/mono-2.4/xsp-2.4$ make&lt;br&gt;
sergiob@sergiob-mono:~/src/mono-2.4/xsp-2.4$ sudo make install&lt;br&gt;
sergiob@sergiob-mono:~/src/mono-2.4/mono-debugger-2.4$ ./configure&lt;br&gt;
sergiob@sergiob-mono:~/src/mono-2.4/mono-debugger-2.4$ make&lt;br&gt;
sergiob@sergiob-mono:~/src/mono-2.4/mono-debugger-2.4$ sudo make install&lt;br&gt;
&lt;/div&gt;
&lt;br&gt;
&lt;span style="font-weight: bold;font-family:arial;font-size:130%;"&gt;9. MonoDevelop.&lt;/span&gt;&lt;br&gt;&lt;br&gt;
&lt;span style="font-family:arial;font-size:85%;"&gt;
Ahora ya estamos listos para instalar MonoDevelop.
&lt;/span&gt;
&lt;br&gt;
&lt;div style="font-family:'Courier New';font-size: 9pt;white-space: pre;line-height: 1;font-size:85%;border:1px solid #000;background-color:#ececec;width:100%;padding-left:10px;"&gt;
sergiob@sergiob-mono:~/src/mono-2.4/monodevelop-2.0$ ./configure&lt;br&gt;
sergiob@sergiob-mono:~/src/mono-2.4/monodevelop-2.0$ make&lt;br&gt;
sergiob@sergiob-mono:~/src/mono-2.4/monodevelop-2.0$ sudo make install&lt;br&gt;
sergiob@sergiob-mono:~/src/mono-2.4/monodevelop-debugger-mdb-2.0$ ./configure&lt;br&gt;
sergiob@sergiob-mono:~/src/mono-2.4/monodevelop-debugger-mdb-2.0$ make&lt;br&gt;
sergiob@sergiob-mono:~/src/mono-2.4/monodevelop-debugger-mdb-2.0$ sudo make install&lt;br&gt;
sergiob@sergiob-mono:~/src/mono-2.4/monodevelop-debugger-gdb-2.0$ ./configure&lt;br&gt;
sergiob@sergiob-mono:~/src/mono-2.4/monodevelop-debugger-gdb-2.0$ make&lt;br&gt;
sergiob@sergiob-mono:~/src/mono-2.4/monodevelop-debugger-gdb-2.0$ sudo make install&lt;br&gt;
sergiob@sergiob-mono:~/src/mono-2.4/monodevelop-database-2.0$ ./configure&lt;br&gt;
sergiob@sergiob-mono:~/src/mono-2.4/monodevelop-database-2.0$ make&lt;br&gt;
sergiob@sergiob-mono:~/src/mono-2.4/monodevelop-database-2.0$ sudo make install&lt;br&gt;
sergiob@sergiob-mono:~/src/mono-2.4/monodevelop-java-2.0$ ./configure&lt;br&gt;
sergiob@sergiob-mono:~/src/mono-2.4/monodevelop-java-2.0$ make&lt;br&gt;
sergiob@sergiob-mono:~/src/mono-2.4/monodevelop-java-2.0$ sudo make install&lt;br&gt;
sergiob@sergiob-mono:~/src/mono-2.4/monodevelop-vala-2.0$ ./configure&lt;br&gt;
sergiob@sergiob-mono:~/src/mono-2.4/monodevelop-vala-2.0$ make&lt;br&gt;
sergiob@sergiob-mono:~/src/mono-2.4/monodevelop-vala-2.0$ sudo make install&lt;br&gt;
&lt;/div&gt;
&lt;br&gt;
&lt;span style="font-family:arial;font-size:85%;"&gt;
Llegados a este punto, ya deberiamos tener instalado el Mono 2.4 y el MonoDevelop 2.0 sin muchos problemas. No desesper&amp;eacute;is si yo lo he podido hacer, entonces lo puede hacer hasta un mono debidamente entrenado o certificado.&lt;br&gt;
Espero que os haya sido de ayuda.
&lt;/span&gt;
&lt;br&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8091076182394048623-2613383106558271358?l=dotnetspanish.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://dotnetspanish.blogspot.com/feeds/2613383106558271358/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://dotnetspanish.blogspot.com/2009/05/instalando-mono24-en-ubuntu.html#comment-form' title='7 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8091076182394048623/posts/default/2613383106558271358'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8091076182394048623/posts/default/2613383106558271358'/><link rel='alternate' type='text/html' href='http://dotnetspanish.blogspot.com/2009/05/instalando-mono24-en-ubuntu.html' title='Instalando Mono2.4 en Ubuntu'/><author><name>Sergio Bermudez</name><uri>http://www.blogger.com/profile/06107182130049911112</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>7</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8091076182394048623.post-6268674961988148118</id><published>2008-10-12T21:16:00.009+02:00</published><updated>2008-10-13T15:09:54.482+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Rhino Mocks'/><category scheme='http://www.blogger.com/atom/ns#' term='Unit Test'/><category scheme='http://www.blogger.com/atom/ns#' term='NUnit'/><title type='text'>Unit Test y Rhino Mocks</title><content type='html'>&lt;span style="font-weight: bold;font-family:arial;font-size:130%;"&gt;Introducción.&lt;/span&gt;&lt;br&gt;
&lt;span style="font-family:arial;font-size:85%;"&gt;Normalmente en las pruebas unitarias no es factible usar objetos reales porque es muy dificil o imposible incorporarlos al test unitario, por ejemplo que el estado de un objeto sea dificil de reproducir como un error de red, o que sea lento como es el caso de una base de datos que primero tiene que ser inicializada para realizar el test, o que desde donde se ejecuta el juego de pruebas no haya acceso.
En estos casos es mejor utilizar "Mocks Objects", los Mocks son objetos que simulan el comportamiento de objetos reales. Un objeto mock tiene la misma interfaz que un objeto real, así que un objeto puede usar de forma indistinta un objeto mock o un objeto real. La importancia de utilizar mocks es poder probar un trozo de código aisladamente, que lo que se pretende con un test unitario.
Rhino Mocks es un Mock Object Framework, que permite realizar estos objetos simulados de una forma automática y crear test unitarios más efectivos.&lt;/span&gt;&lt;br&gt;
&lt;span style="font-weight: bold;font-family:arial;font-size:130%;"&gt;Creado Test Unitarios.&lt;/span&gt;&lt;br&gt;
&lt;span style="font-family:arial;font-size:85%;"&gt;Supogamos el siguiente ejemplo, la clase de negocio CutomerBusiness de la que queremos realizar el test unitario del método HasSpecialFare, que devuelve cierto en el caso que el cliente que le pasamos poseea una tarifa especial.
Este método utiliza objeto de acceso a datos (customerDao) que se conecta con la base de datos y obtiene la tarifa del cliente, y una vez obtenida la tarifa compara el código de la tarifa con el código de tarifa especial.&lt;/span&gt;
&lt;div style="font-family:courier;white-space: pre;line-height: 1;font-size:85%;border:1px solid #000;background-color:#ececec;width:95%;padding-left:10px;"&gt;
&lt;span style="font-family: 'Courier New';font-size: 9pt;"&gt;public class CustomerBusiness
{
    private const string SPECIAL_FARE = "SPC";

    private readonly ICustomerDao customerDao;

    public CustomerBusiness(ICustomerDao customerDao)
    {
        this.customerDao = customerDao;
    }

    public bool HasSpecialFare(Customer customer)
    {
        return customerDao.GetFareType(customer).Type 
                             == SPECIAL_FARE;
    }
}

public interface ICustomerDao
{
    FareType GetFareType(Customer customer);
}
...
&lt;/span&gt;
&lt;/div&gt;
&lt;span style="font-family:arial;font-size:85%;"&gt;Queremos realizar el test unitario de este método aisladamente, no nos interesa saber si el objeto CustomerDao es capaz de extraer correctamente o no la tarifa, de eso ya se encargará el test unitario que hagamos sobre el objeto dao, lo único que en este caso nos interesa es saber si este código es capaz de funcionar o no. Por esto ni siquiera nos hemos molestado en codificar el objeto CustomerDao, tan solo hemos codificado la parte de la interfaz necesaria para este ejemplo.
Si no utilizamos RhinoMocks deberiamos primero implementar el objeto CustomerDao para que se conectara a la base de datos, comprobar que se conecta correctamente y que obtenga los datos correctos, además de tener acceso a la base de datos desde donde se ejecuten los test. Por otro lado si lo hacemos así, primero se debería pasar las pruebas de los DAO antes de pasar las pruebas de los business, esto implica que hay pruebas que dependen las unas de las otras, esto no debería pasar nunca ya que la definición de test unitario pierde todo su sentido.
Para evitar este problema podriamos crear un objeto Dao dummy, que devolviera unos resultados ficticios en función de las necesidades, esta solución sería muy costosa ya que deberíamos hacerlo para todos los objetos DAO de nuestra solución, y la realización de test unitarios sería interminable, y esto es justamente lo que hace RhinoMocks. Además de la creación automática de objeto dummy, RhinoMocks nos permite llegar a testear si se llama a ciertos métodos o no.

Ahora crearemos un test unitario con RhinoMocks para probar el método HasSpecialFareType de la clase CustomerBusiness. Para realización de los test unitarios utilizaremos NUnit.&lt;/span&gt;
&lt;div style="font-family:courier;white-space: pre;line-height: 1;font-size:85%;border:1px solid #000;background-color:#ececec;width:95%;padding-left:10px;"&gt;
&lt;span style="font-family: 'Courier New';font-size: 9pt;"&gt;[TestFixture]
public class CustomerBusinessTest
{
    [Test]
    public void HasSpecialFareTest()
    {
        //Creación de los objetos mocks
        var mockRepository = new MockRepository();
        var customerDaoMock = 
              mockRepository.CreateMock&amp;lt;ICustomerDao&amp;gt;();

        //Establecimiento de las llamadas esperadas 
        //y de los objetos de retorno
        var customer = new Customer();
        var fareType = new FareType 
                 {Type = CustomerBusiness.SPECIAL_FARE};
        Expect.Call(customerDaoMock.GetFareType(customer))
                                 .Return(fareType);

        mockRepository.ReplayAll();

        var customerBusiness = 
                 new CustomerBusiness(customerDaoMock);
        var specialFare = 
                 customerBusiness.HasSpecialFare(customer);
        mockRepository.VerifyAll();
        Assert.IsTrue(specialFare);
    }
}
&lt;/span&gt;
&lt;/div&gt;
&lt;span style="font-family:arial;font-size:85%;"&gt;Lo primero que hacemos es crear el repositorio de Mocks, a este objeto repositorio le pedimos que cree un Mock que implemente la interfaz ICustomerDao, el repositorio nos devolverá un objeto dummy que de momento lo único que hará será implementar esa interfaz sin ninguna acción en particular.
Ahora le diremos al mock que esperamos que se realice una llamada al método GetFareType, al que se le pasará un objeto customer y queremos que devuelva el objeto fareType especificado. Si tuvieramos más llamadas lo hariamos con cada una de ellas, como si fuera una macro en la que no importa el orden.
Una vez hecho esto, le decimos al repositorio que guarde la macro que hasta ahora hemos introducido, y codificamos lo que vamos a probar, creamos un objeto customerBusiness y llamamos al metodo HasSpecialFare, que a su vez llamara al metodo GetFareType del dao, y le devolverá el objeto fareType.
Por último, le decimos al repositorio que verifique todas que todo ha ido bien, si durante la ejecución del test no se hubiera llamado al método GetFareType, o se hubiera llamado a otro hubiera dado error. &lt;a href='http://petxosergh.googlecode.com/files/RhinoMocks.Sample1.rar'&gt;Pulsa aquí para descargar el ejemplo.&lt;/a&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8091076182394048623-6268674961988148118?l=dotnetspanish.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://dotnetspanish.blogspot.com/feeds/6268674961988148118/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://dotnetspanish.blogspot.com/2008/10/unit-test-y-rhino-mocks.html#comment-form' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8091076182394048623/posts/default/6268674961988148118'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8091076182394048623/posts/default/6268674961988148118'/><link rel='alternate' type='text/html' href='http://dotnetspanish.blogspot.com/2008/10/unit-test-y-rhino-mocks.html' title='Unit Test y Rhino Mocks'/><author><name>Sergio Bermudez</name><uri>http://www.blogger.com/profile/06107182130049911112</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8091076182394048623.post-1359425371069531539</id><published>2008-09-18T17:08:00.014+02:00</published><updated>2008-09-29T11:31:12.354+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Container'/><category scheme='http://www.blogger.com/atom/ns#' term='IoC'/><category scheme='http://www.blogger.com/atom/ns#' term='Windsor Container'/><category scheme='http://www.blogger.com/atom/ns#' term='Castle Project'/><category scheme='http://www.blogger.com/atom/ns#' term='Windsor'/><category scheme='http://www.blogger.com/atom/ns#' term='Inversion of Control'/><title type='text'>Windsor Container Part. II</title><content type='html'>&lt;span style="font-weight: bold;font-family:arial;font-size:130%;"&gt;Introducción.&lt;/span&gt;&lt;br&gt;
&lt;span style="font-family:arial;font-size:85%;"&gt;En este art&amp;iacute;culo veremos como afectan los cambios en el c&amp;oacute;digo a la configuración de Windsor Container y veremos como afectar&amp;iacute;an en el caso de no utilizar WC.&lt;/span&gt;&lt;br&gt;
&lt;span style="font-weight: bold;font-family:arial;font-size:130%;"&gt;Interfaces.&lt;/span&gt;&lt;br&gt;
&lt;span style="font-family:arial;font-size:85%;"&gt;Las primeras modificaciones que haremos ser&amp;aacute; crear una interfaz para la clase sumador.&lt;/span&gt;
&lt;div style="font-family:courier;white-space: pre;line-height: 1;font-size:85%;border:1px solid #000;background-color:#ececec;width:95%;padding-left:10px;"&gt;
&lt;span style="font-family: 'Courier New';font-size: 9pt;"&gt;public interface ISumador
{
   decimal Suma(decimal num1, decimal num2);
}

public class Sumador : ISumador
{
    public decimal Suma(decimal num1, decimal num2)
    {
        return num1 + num2;
    }
}
...
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&amp;lt;ISumador&amp;gt;();

    var result = sumador.Suma(1,1);
}
...
&lt;/span&gt;
&lt;/div&gt;
&lt;span style="font-family:arial;font-size:85%;"&gt;Al generar la interfaz en vez pedirle al contenedor que nos devuelva un objeto de tipo Sumador, le pedimos un objeto que implemente la interfaz sumador. Para esto debemos modificar el fichero de configuración de WC, añadiendo el atributo service al componente Sumador.
&lt;/span&gt;
&lt;div style="font-family:courier;white-space: pre;line-height: 1;font-size:85%;border:1px solid #000;background-color:#ececec;width:95%;padding-left:10px;"&gt;
&lt;span style="font-family: 'Courier New';font-size: 9pt;"&gt;&amp;lt;configuration&amp;gt;
    &amp;lt;components&amp;gt;
        &amp;lt;component id="Sumador" 
            type="IoC.Tutoriales.Part2.Sumador,
                              IoC.Tutoriales.Part2" 
            service="IoC.Tutoriales.Part2.ISumador,
                              IoC.Tutoriales.Part2" 
            /&amp;gt;
    &amp;lt;/components&amp;gt;
&amp;lt;/configuration&amp;gt;
&lt;/span&gt;
&lt;/div&gt;
&lt;span style="font-family:arial;font-size:85%;"&gt;Con esto al pedir un objeto que implemente la interfaz ISumador, el contendor buscar&amp;aacute; el primer componente que implemente esta interfaz y devolverá un objeto de la clase de ese componente. En nuestro caso buscar&amp;aacute; un componente que implemente la interfaz ISumador, el componente con el id "Sumador", y generar&amp;aacute; un objeto del tipo "IoC.Tutoriales.Part2.Sumador". Al realizar estos cambios si ahora al contendor le pedimos un objeto Sumador se producirá un error ya que los tipos de service prevalecen sobre los tipos de atributo type.
&lt;/span&gt;&lt;br&gt;
&lt;span style="font-weight: bold;font-family:arial;font-size:130%;"&gt;Dependencias entre componentes.&lt;/span&gt;&lt;br&gt;
&lt;span style="font-family:arial;font-size:85%;"&gt;Supogamos que cada vez que realizamos una suma queremos que se guarde un log en un fichero. Primero escribiremos nuestra clase que graba el log:
&lt;/span&gt;
&lt;div style="font-family:courier;white-space: pre;line-height: 1;font-size:85%;border:1px solid #000;background-color:#ececec;width:95%;padding-left:10px;"&gt;
&lt;span style="font-family: 'Courier New';font-size: 9pt;"&gt;public interface ILogger
{
    void Debug(string text);
}

public class FileLogger : ILogger
{
    private string fileName;

    public FileLogger(string fileName)
    {
        this.fileName = fileName;
    }

    public void Debug(string text)
    {
        //Graba el texto en el fichero fileName
        ....
    }
}
&lt;/span&gt;
&lt;/div&gt;

&lt;span style="font-family:arial;font-size:85%;"&gt;Los cambios en la clase Sumador serían de tipo:
&lt;/span&gt;

&lt;div style="font-family:courier;white-space: pre;line-height: 1;font-size:85%;border:1px solid #000;background-color:#ececec;width:95%;padding-left:10px;"&gt;
&lt;span style="font-family: 'Courier New';font-size: 9pt;"&gt;public class Sumador
{
    private ILogger logger;
    
    public Sumador(ILogger logger)
    {
        this.logger = logger;
    }
    public decimal Suma(decimal num1, decimal num2)
    {
        logger.Debug(string.Format("Sumando {0} + {1}",
                                        num1, num2));
        return num1 + num2;
    }
}
&lt;/span&gt;
&lt;/div&gt;
&lt;span style="font-family:arial;font-size:85%;"&gt;Para una arquitectura de este tipo sin utilizar WC deberimos pirmero crear un objeto de tipo FileLogger y pasarlo al constructor del objeto Sumador.
&lt;/span&gt;
&lt;div style="font-family:courier;white-space: pre;line-height: 1;font-size:85%;border:1px solid #000;background-color:#ececec;width:95%;padding-left:10px;"&gt;
&lt;span style="font-family: 'Courier New';font-size: 9pt;"&gt;...
public static void Main(string[] args)
{
    var logger = new FileLogger("log.txt");
    var sumador = new Sumador(logger);
    var result = sumador.Suma(1,1);
}
&lt;/span&gt;
&lt;/div&gt;
&lt;span style="font-family:arial;font-size:85%;"&gt;Al utilizar Windsor Container lo único que tenemos que cambiar es el fichero de configuraci&amp;oacute;n de la siguiente forma:
&lt;/span&gt;
&lt;div style="font-family:courier;white-space: pre;line-height: 1;font-size:85%;border:1px solid #000;background-color:#ececec;width:95%;padding-left:10px;"&gt;
&lt;span style="font-family: 'Courier New';font-size: 9pt;"&gt;&amp;lt;configuration&amp;gt;
    &amp;lt;components&amp;gt;
        &amp;lt;component id="Sumador" 
            type="IoC.Tutoriales.Part2.Sumador,
                           IoC.Tutoriales.Part2" 
            service="IoC.Tutoriales.Part2.ISumador,
                           IoC.Tutoriales.Part2" 
            /&amp;gt;
        &amp;lt;component id="Logger" 
            type="IoC.Tutoriales.Part2.FileLogger,
                           IoC.Tutoriales.Part2" 
            service="IoC.Tutoriales.Part2.ILogger,
                           IoC.Tutoriales.Part2"&amp;gt;
           &amp;lt;parameters&amp;gt;
               &amp;lt;fileName&amp;gt;C:\log.txt&amp;lt;/fileName&amp;gt;
           &amp;lt;/parameters&amp;gt;
        &amp;lt;/component&amp;gt;
    &amp;lt;/components&amp;gt;
&amp;lt;/configuration&amp;gt;
&lt;/span&gt;
&lt;/div&gt;
&lt;span style="font-family:arial;font-size:85%;"&gt;El metodo Main no habría que modificarlo y quedaría como lo teniamos:
&lt;/span&gt;
&lt;div style="font-family:courier;white-space: pre;line-height: 1;font-size:85%;border:1px solid #000;background-color:#ececec;width:95%;padding-left:10px;"&gt;
&lt;span style="font-family: 'Courier New';font-size: 9pt;"&gt;...
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&amp;lt;ISumador&amp;gt;();

    var result = sumador.Suma(1,1);
}
&lt;/span&gt;
&lt;/div&gt;
&lt;span style="font-family:arial;font-size:85%;"&gt;Al realizar una petici&amp;oacute;n, Windsor Container busca en el contendor el componente que cumpla esa petici&amp;oacute;n, una vez encontrado buscar&amp;aacute; las dependencias de ese componente en el contenedor, y así sucesivamente, si alguna de las dependencias no pueden ser satisfechas Windsor Container devolverá una excepci&amp;oacute;n. En nuestro caso encontaría el componente con id "Sumador" que es del tipo "IoC.Tutoriales.Part2.Sumador", este clase tiene una dependecia con la clase "IoC.Tutoriales.Part2.ILogger", así que buscar&amp;aacute; dentro del contenedor si existe alg&amp;uacute;n componente que satisfaga esta dependecia, y encontrar&amp;iacute;a el comoponente con id "Logger". De forma que para crear un objeto de tipo "IoC.Tutoriales.Part2.Sumador" primero crear&amp;aacute; un objecto de tipo "IoC.Tutoriales.Part2.FileLogger".
&lt;/span&gt;
&lt;br&gt;
&lt;span style="font-weight: bold;font-family:arial;font-size:130%;"&gt;Un pequeño refactoring.&lt;/span&gt;&lt;br&gt;
&lt;span style="font-family:arial;font-size:85%;"&gt;Supongamos ahora que en vez de guardar el log en un fichero lo debemos guardar en base de datos. Lo primero sería generar las clases necesarias para guardar el log en base de datos:
&lt;/span&gt;
&lt;div style="font-family:courier;white-space: pre;line-height: 1;font-size:85%;border:1px solid #000;background-color:#ececec;width:95%;padding-left:10px;"&gt;
&lt;span style="font-family: 'Courier New';font-size: 9pt;"&gt;public class DBLogger : ILogger
{
    private string connectionString;
    
    public DBLogger(string connectionString)
    {
        this.connectionString = connectionString;
    }
    
    public void Debug(string text)
    {
        //Graba el texto en la base de datos
        ....
    }
}
&lt;/span&gt;
&lt;/div&gt;
&lt;span style="font-family:arial;font-size:85%;"&gt;Ahora lo &amp;uacute;nico que tenemos que hacer es cambiar el fichero de configuraci&amp;oacute;n de Windsor Container para que tenga en cuenta el nuevo logger:
&lt;/span&gt;
&lt;div style="font-family:courier;white-space: pre;line-height: 1;font-size:85%;border:1px solid #000;background-color:#ececec;width:95%;padding-left:10px;"&gt;
&lt;span style="font-family: 'Courier New';font-size: 9pt;"&gt;&amp;lt;configuration&amp;gt;
    &amp;lt;components&amp;gt;
        &amp;lt;component id="Sumador" 
            type="IoC.Tutoriales.Part2.Sumador,
                           IoC.Tutoriales.Part2" 
            service="IoC.Tutoriales.Part2.ISumador,
                           IoC.Tutoriales.Part2"
            /&amp;gt;
        &amp;lt;component id="Logger" 
            type="IoC.Tutoriales.Part2.DBLogger,
                           IoC.Tutoriales.Part2" 
            service="IoC.Tutoriales.Part2.ILogger,
                           IoC.Tutoriales.Part2"&amp;gt;
           &amp;lt;parameters&amp;gt;
               &amp;lt;connectionString&amp;gt;...&amp;lt;/connectionString&amp;gt;
           &amp;lt;/parameters&amp;gt;
       &amp;lt;/component&amp;gt;
    &amp;lt;/components&amp;gt;
&amp;lt;/configuration&amp;gt;
&lt;/span&gt;
&lt;/div&gt;
&lt;span style="font-family:arial;font-size:85%;"&gt;Con estos pequeños cambios todo lo demás funcionaría de la misma forma, lo único que cambiar&amp;aacute; ser&amp;iacute;a que al satisfacer la interfaz ILogger en vez de crear un objeto FileLogger crear&amp;aacute; un objeto DBLogger.
Como podemos ver el hecho de trabajar contra interfaces y utilizar Windsor Container facilita enormemente cualquier tipo de refactoring.
&lt;a href="http://petxosergh.googlecode.com/files/IoC.Tutoriales.Part2.rar"&gt;El código del ejemplo se encuentra en este link.&lt;/a&gt;
&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8091076182394048623-1359425371069531539?l=dotnetspanish.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://dotnetspanish.blogspot.com/feeds/1359425371069531539/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://dotnetspanish.blogspot.com/2008/09/windsor-container-part-ii.html#comment-form' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8091076182394048623/posts/default/1359425371069531539'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8091076182394048623/posts/default/1359425371069531539'/><link rel='alternate' type='text/html' href='http://dotnetspanish.blogspot.com/2008/09/windsor-container-part-ii.html' title='Windsor Container Part. II'/><author><name>Sergio Bermudez</name><uri>http://www.blogger.com/profile/06107182130049911112</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8091076182394048623.post-5494468765747021553</id><published>2008-08-30T13:13:00.009+02:00</published><updated>2009-08-03T12:00:55.129+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Container'/><category scheme='http://www.blogger.com/atom/ns#' term='IoC'/><category scheme='http://www.blogger.com/atom/ns#' term='Windsor Container'/><category scheme='http://www.blogger.com/atom/ns#' term='Castle Project'/><category scheme='http://www.blogger.com/atom/ns#' term='Windsor'/><category scheme='http://www.blogger.com/atom/ns#' term='Inversion of Control'/><title type='text'>Windsor Container Part. I</title><content type='html'>&lt;span style="font-weight: bold;font-family:arial;font-size:130%;"&gt;Introducción.&lt;/span&gt;&lt;br&gt;
&lt;span style="font-family:arial;font-size:85%;"&gt;Windsor Container es un "Inversion of Control Container" que forma parte del conjunto de soluciones open source de &lt;a href="http://www.castleproject.org/"&gt;Castle Project&lt;/a&gt; junto a Monorail, Active Record y MicroKernel.&lt;BR&gt;&lt;br&gt;Pero vayamos por partes.  Antes de explicar que es Windsor Container deberiamos saber que es la &lt;a href="http://en.wikipedia.org/wiki/Inversion_of_Control"&gt;"Inversion of Control"&lt;/a&gt; (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.&lt;br&gt;
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.
&lt;/span&gt;&lt;br/&gt;
&lt;span style="font-weight: bold;font-family:arial;font-size:130%;"&gt;Como utilizar Windsor Container.&lt;/span&gt;&lt;br/&gt;
&lt;span style="font-family:arial;font-size:85%;"&gt;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:
&lt;/span&gt;
&lt;div style="font-family:courier;white-space: pre;line-height: 1;font-size:85%;border:1px solid #000;background-color:#ececec;width:95%;padding-left:10px;"&gt;
&lt;span style="font-family: 'Courier New';font-size: 9pt;"&gt;public class Sumador
{
    public decimal Suma(decimal num1, decimal num2)
    {
        return num1 + num2;
    }
}
&lt;/span&gt;
&lt;/div&gt;
&lt;span style="font-family:arial;font-size:85%;"&gt;Sin Windsor Container(WC) para utilizar esta clase escribiriamos código de este tipo:
&lt;/span&gt;
&lt;div style="font-family:courier;white-space: pre;line-height: 1;font-size:85%;border:1px solid #000;background-color:#ececec;width:95%;padding-left:10px;"&gt;
&lt;span style="font-family: 'Courier New';font-size: 9pt;"&gt;...
public static void Main(string[] args)
{
    var sumador = new Sumador();
    var result = sumador.Suma(1,1);
}
...
&lt;/span&gt;
&lt;/div&gt;
&lt;span style="font-family:arial;font-size:85%;"&gt;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.
&lt;/span&gt;
&lt;div style="font-family:courier;white-space: pre;line-height: 1;font-size:85%;border:1px solid #000;background-color:#ececec;width:95%;padding-left:10px;"&gt;
&lt;span style="font-family: 'Courier New';font-size: 9pt;"&gt;...
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&amp;lt;Sumador&amp;gt;();

    var result = sumador.Suma(1,1);
}
...
&lt;/span&gt;
&lt;/div&gt;
&lt;span style="font-family:arial;font-size:85%;"&gt;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:&lt;/span&gt;
&lt;div style="font-family:courier;white-space: pre;line-height: 1;font-size:85%;border:1px solid #000;background-color:#ececec;width:95%;padding-left:10px;"&gt;
&lt;span style="font-family: 'Courier New';font-size: 9pt;"&gt;&amp;lt;configuration&amp;gt;
    &amp;lt;components&amp;gt;
        &amp;lt;component id="Sumador" 
            type="IoC.Tutoriales.Part1.Sumador, 
                       IoC.Tutoriales.Part1" /&amp;gt;
    &amp;lt;/components&amp;gt;
&amp;lt;/configuration&amp;gt;
&lt;/span&gt;
&lt;/div&gt;
&lt;span style="font-family:arial;font-size:85%;"&gt;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.
&lt;a href="http://petxosergh.googlecode.com/files/IoC.Tutoriales.Part1.rar"&gt;El código de ejemplo de este tutorial se encuentra en este link.&lt;/a&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8091076182394048623-5494468765747021553?l=dotnetspanish.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://dotnetspanish.blogspot.com/feeds/5494468765747021553/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://dotnetspanish.blogspot.com/2008/08/windsor-container-part-i.html#comment-form' title='1 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8091076182394048623/posts/default/5494468765747021553'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8091076182394048623/posts/default/5494468765747021553'/><link rel='alternate' type='text/html' href='http://dotnetspanish.blogspot.com/2008/08/windsor-container-part-i.html' title='Windsor Container Part. I'/><author><name>Sergio Bermudez</name><uri>http://www.blogger.com/profile/06107182130049911112</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry></feed>
