<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	xmlns:georss="http://www.georss.org/georss" xmlns:geo="http://www.w3.org/2003/01/geo/wgs84_pos#" xmlns:media="http://search.yahoo.com/mrss/"
	>

<channel>
	<title>iHenry Smith</title>
	<atom:link href="http://ihenrysmith.wordpress.com/feed/" rel="self" type="application/rss+xml" />
	<link>http://ihenrysmith.wordpress.com</link>
	<description>Porgramación, ideas y conceptos!</description>
	<lastBuildDate>Mon, 10 Jan 2011 04:35:11 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.com/</generator>
<cloud domain='ihenrysmith.wordpress.com' port='80' path='/?rsscloud=notify' registerProcedure='' protocol='http-post' />
<image>
		<url>http://0.gravatar.com/blavatar/81302bda143fef29f17c1a656c4cd84d?s=96&#038;d=http%3A%2F%2Fs2.wp.com%2Fi%2Fbuttonw-com.png</url>
		<title>iHenry Smith</title>
		<link>http://ihenrysmith.wordpress.com</link>
	</image>
	<atom:link rel="search" type="application/opensearchdescription+xml" href="http://ihenrysmith.wordpress.com/osd.xml" title="iHenry Smith" />
	<atom:link rel='hub' href='http://ihenrysmith.wordpress.com/?pushpress=hub'/>
		<item>
		<title>Iniciando nServiceBus con un ejemplo en GUI</title>
		<link>http://ihenrysmith.wordpress.com/2010/12/26/iniciando-nservicebus-con-un-ejemplo-en-gui/</link>
		<comments>http://ihenrysmith.wordpress.com/2010/12/26/iniciando-nservicebus-con-un-ejemplo-en-gui/#comments</comments>
		<pubDate>Sun, 26 Dec 2010 18:35:46 +0000</pubDate>
		<dc:creator>ihenrysmith</dc:creator>
				<category><![CDATA[.net]]></category>
		<category><![CDATA[Castle Windsor]]></category>
		<category><![CDATA[IoC]]></category>
		<category><![CDATA[nServiceBus]]></category>
		<category><![CDATA[Service Bus]]></category>
		<category><![CDATA[WCF]]></category>

		<guid isPermaLink="false">http://ihenrysmith.wordpress.com/?p=23</guid>
		<description><![CDATA[Algunos nos hemos topado que cuando queremos comenzar a utilizar nServiceBus los ejemplos pueden ser un poco confusos.  Notamos que utilizan  NServiceBus.Host y cuando abrimos la “solución” del Visual Studio parece que todo sucede por arte de magia.  Esto es lo bello del nServiceBus, que te implementa gran parte del trabajo de una forma elegante, [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=ihenrysmith.wordpress.com&amp;blog=13060102&amp;post=23&amp;subd=ihenrysmith&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p>Algunos nos hemos topado que cuando queremos comenzar a utilizar <strong>nServiceBus </strong>los ejemplos pueden ser un poco confusos.  Notamos que utilizan  <a href="http://nservicebus.com/GenericHost.aspx" target="_blank">NServiceBus.Host</a> y cuando abrimos la “solución” del <strong><em>Visual Studio</em></strong> parece que todo sucede por arte de magia.  Esto es lo bello del <strong>nServiceBus</strong>, que te implementa gran parte del trabajo de una forma elegante, flexible y probada.  Sin embargo en este ejemplo dejaremos el <a href="http://nservicebus.com/GenericHost.aspx" target="_blank">NServiceBus.Host</a> de lado y levantemos el Bus utilizando una forma gráfica.</p>
<h2>El Concepto</h2>
<p>No me voy a referir mucho al tema de ¿qué es <strong>nServiceBus</strong>? o sobre ¿qué es lo que hace y qué no hace?.  Por lo pronto solo  voy a mencionar algunas dudas primarias que surgen al iniciar en este mundo.<br />
<strong>nServiceBus:</strong></p>
<ul>
<li>No está hecho para remplazar WCF, puede por el contrario complementarse con WCF.</li>
<li>No es un <strong><em>Broker</em></strong>, no viene a remplazar <em><strong>Biztalk</strong></em> por ejemplo.</li>
<li>No está echo para problemas en los que se requiere comunicación sincrónica, aunque puede emularla.</li>
<li>Esta echo para hacer Publish-Subscriber <strong>bien</strong>.</li>
<li>El canal principal de comunicación son las colas (<em><strong>queues</strong></em>), igual, pueden utilizarse otros medios, pero el más natural son las colas.</li>
<li>Es un proyecto <em><strong> </strong></em>creado y administrado por <a href="http://www.udidahan.com/">Udi Dahan</a>, no es proyecto Microsoft, ni está en CodePlex.  Inició <em><strong>Open Source</strong></em> hasta el RTM 2.0, pero debido a su aceptación y alegando la necesidad de salvarlo de su propio éxito se creo un <em><strong>Branch</strong></em> comercial a partir de la versión 2.5  en la cual la licencia se cambió y se estableció un sistema de licenciamiento, con restricciones para la versión para la comunidad que parte comercial provee.  Se mantiene una versión para la comunidad en la versión 2.0 .</li>
</ul>
<h2><strong>Recursos</strong></h2>
<ul>
<li>La pagina de la versión <em><strong>Open Source</strong></em> <a title="Home" href="http://www.nservicebus.org/" target="_blank">Home</a> donde se puede encontrar los ejecutables, documentación, ejemplos e información en general sobre el proyecto.</li>
<li>La versión comercial <a href="http://www.nservicebus.com/" target="_blank">Home</a> con su sistema de <a href="http://www.nservicebus.com/LicensePackages.aspx" target="_blank">licenciamiento</a>.</li>
<li>El <a href="http://www.nservicebus.com/Documentation.aspx" target="_blank">wiki</a> oficial. Cuando era un proyecto <strong><em>Open Source</em></strong> si bien no era muy buena, si era mejor que la de muchos proyectos de código abierto.  Ahora con la nueva faceta comercial esperamos una mejora importante.</li>
<li>El código fuente en <a href="http://sourceforge.net/projects/nservicebus/" target="_blank">sourceforce</a> por si nos interesa contribuir con el proyecto o entenderlo a fondo.  El lado comercial se migró a <a href="https://github.com/NServiceBus/NServiceBus" target="_blank">GitHub</a>, donde se puede encontrar el código con restricciones.</li>
<li><a href="http://tech.groups.yahoo.com/group/nservicebus/" target="_blank">Foro de discusión</a> una parte importante que he notado es que este foro es muy activo y el mismo <a href="http://www.udidahan.com/">Udi Dahan</a> constantemente está colaborando en las discusiones.  Es un <strong><em>yahoo group</em></strong>, muchos como yo, probablemente se verán forzados ah abrir una cuenta en <strong><em>yahoo</em></strong>.</li>
</ul>
<h2><strong>El Ejemplo</strong></h2>
<p>El ejemplo es simple e integra dos patrones el <em><strong>Publish-Subscriber</strong></em> y el <em><strong>Request and Response</strong></em> .  Un cliente (Subscritor) que  espera alertas y un servidor (Publicador) que dispara alertas a sus subscriptores.  A su vez el cliente puede validar una dirección de correo electrónico contra el servidor, de la forma <em><strong>Request and Response</strong></em>.</p>
<p>Para el ejemplo se debe tener <a title="Microsoft Message Queuing" href="http://en.wikipedia.org/wiki/Microsoft_Message_Queuing" target="_blank"><em><strong>MSMQ</strong></em></a> instalado, para ello se puede correr el <em><strong>bat</strong></em> que viene con los binarios del nServiceBus <em><strong>RunMeFirst.bat</strong></em> con privilegios de administrador de la forma:  <em><strong>RunMeFirst.bat /i</strong></em></p>
<p>Para descargar el <a title="Archivo del Ejemplo" href="http://dl.dropbox.com/u/18214879/MessageServer.zip">ejemplo</a><em><strong><br />
</strong></em></p>
<h5>Los Mensajes</h5>
<p>En nuestra solución lo primero que hacemos es crear un proyecto (<em><strong>Library</strong></em>) que contenga los mensajes que serán transmitidos por el bus. Para ello agregamos el DLL NServiceBus y heredamos nuestras clases mensaje de la interface IMessage.  Estos mensajes serán DTOs y los atributos tienen la restricción de que deben ser <em>serializables</em></p>
<p><pre class="brush: csharp;">
using System;
using NServiceBus;

namespace Messages
{
   [Serializable]
   [TimeToBeReceived(&quot;00:00:30&quot;)]
   public class Alert : IMessage
   {
      public string From { get; set; }
      public string AlertType { get; set; }
      public DateTime Date { get; set; }
      public WireEncryptedString AlertMessage { get; set; }
   }
}
</pre></p>
<p>En <span style="font-family:Consolas, Monaco, 'Courier New', Courier, monospace;font-size:12px;line-height:18px;white-space:pre;">TimeToBeReceived</span> se indica que se dan 30 segundos para que el mensaje sea recibido, de lo contrario se borrara.  <span style="font-family:Consolas, Monaco, 'Courier New', Courier, monospace;font-size:12px;line-height:18px;white-space:pre;">WireEncryptedString</span> es una clase que provee <a href="http://www.nservicebus.com/" target="_blank">nServiceBus </a>y nos permite enviar un texto encriptado.</p>
<h5>El Server (Publisher/Publicador)</h5>
<p>Comenzaremos por el servidor.  Lo primero será crear y configurar las secciones del <a title="nServiceBus Comercial" href="http://www.nservicebus.com" target="_blank"><em><strong>nServiceBus</strong></em></a></p>
<p><pre class="brush: xml;">
&lt;configSections&gt;
&lt;section name=&quot;MsmqTransportConfig&quot;
            type=&quot;NServiceBus.Config.MsmqTransportConfig, NServiceBus.Core&quot;/&gt;
&lt;section name=&quot;UnicastBusConfig&quot;
            type=&quot;NServiceBus.Config.UnicastBusConfig, NServiceBus.Core&quot;/&gt;
&lt;section name=&quot;RijndaelEncryptionServiceConfig&quot;
            type=&quot;NServiceBus.Config.RijndaelEncryptionServiceConfig, NServiceBus.Core&quot;/&gt;
&lt;/configSections&gt;

&lt;MsmqTransportConfig InputQueue=&quot;MessageServerInputQueue&quot;
ErrorQueue=&quot;error&quot; NumberOfWorkerThreads=&quot;1&quot; MaxRetries=&quot;5&quot;/&gt;

&lt;UnicastBusConfig DistributorControlAddress=&quot;&quot; DistributorDataAddress=&quot;&quot;&gt;
&lt;MessageEndpointMappings&gt;
&lt;/MessageEndpointMappings&gt;
&lt;/UnicastBusConfig&gt;

&lt;RijndaelEncryptionServiceConfig Key=&quot;gdDbqRpqdRbTs3mhdZh9qCaDaxJXl+e7&quot;/&gt;
</pre></p>
<p>En <span style="font-family:Consolas, Monaco, 'Courier New', Courier, monospace;font-size:12px;line-height:18px;white-space:pre;">MsmqTransportConfig </span>lo que hacemos es configurar las colas de transporte, la primera InputQueue es por la cual el servidor escuchará los mensajes y en la segunda ErrorQueue se escribirán los errores<span style="font-family:Consolas, Monaco, 'Courier New', Courier, monospace;font-size:12px;line-height:18px;white-space:pre;"> </span>.  En <span style="font-family:Consolas, Monaco, 'Courier New', Courier, monospace;font-size:12px;line-height:18px;white-space:pre;">UnicastBusConfig</span> se configura el bus y los <em><strong>EndPoints</strong></em>, pero en este caso el servidor no expondrá ninguno.</p>
<p>Inicializamos el Bus</p>
<p><pre class="brush: csharp;">
_bus = Configure.With()
	.CastleWindsorBuilder() //Vamos a utilizar Windsor en vez de Spring
	.XmlSerializer() //Serialización por XML
	.MsmqSubscriptionStorage() //Guardamos los Subscriptores en una cola
	.MsmqTransport() // Transporte por colas
  	    .IsTransactional(true)
	    .PurgeOnStartup(false) //Limpiar las colas al Iniciar
	.UnicastBus() //El bus (única opción disponible)
	.ImpersonateSender(false)
	.LoadMessageHandlers() //Cargar los handlers al iniciar
	.RijndaelEncryptionService() //Usar el servicio de encriptación
	.CreateBus() // Crea el bus
	.Start();    //Inicial el bus
</pre></p>
<p>La mayoría de las cosas suceden por <strong><em><a title="Inversión de Control" href="http://ihenrysmith.wordpress.com/2010/03/14/inversion-de-control-e-inyeccion-de-dependencias/" target="_blank">IoC</a></em></strong>.  Por defecto nServiceBus usa <a title="Spring" href="http://www.springframework.net/"><em><strong>Spring</strong></em></a> como contenedor IoC, en este caso lo cambiamos a usar <em><strong><a title="Castle Windsor IoC" href="http://stw.castleproject.org/Windsor.MainPage.ashx" target="_blank">CastleWindsor</a></strong></em> del<a title="Castle Project" href="http://www.castleproject.org/" target="_blank"><strong><em> Castle Project</em></strong></a> solo para ilustrar el cambio (esto obliga a agregar los <strong><em>DLL</em></strong>s del <strong><em>Castle</em></strong> a la solución) .  <strong>LoadMessageHandlers()</strong> inspecciona el <em><strong>assembly </strong></em>y carga los <strong><em>Handlers </em></strong>que existan en este, más adelante veremos como esto nos puede complicar la existencia cuando intentemos pasar los response de los <em><strong>handlers</strong></em> al hilo principal del despliegue gráfico.</p>
<h6>Publicar un mensaje</h6>
<p>Para publicar un mensaje lo único que se hace es llamar al método Publish del bus y nServiceBus se encarga del resto.</p>
<p><pre class="brush: csharp;">
_bus.Publish(new Alert()
{
       Date = DateTime.Now,
       AlertMessage =
       string.Format(&quot;Transmitted encrypted Alert Message: {0}&quot;,
       txtAlertMessage.Text),
       From = Environment.MachineName,
       AlertType = &quot;info&quot;,
});
</pre></p>
<h6>Handlers</h6>
<p>Los podemos ver como hilos que son disparados cuando se recibe un mensaje del tipo que ellos esperan</p>
<p><pre class="brush: csharp;">
public class ValidateEmailHandler : IHandleMessages&lt;ValidateEmailRequest&gt;
{

    #region Members
    private string _strRegex = @&quot;^([a-zA-Z0-9_\-\.]+)@((\[[0-9]{1,3}&quot; +
                @&quot;\.[0-9]{1,3}\.[0-9]{1,3}\.)|(([a-zA-Z0-9\-]+\&quot; +
                @&quot;.)+))([a-zA-Z]{2,4}|[0-9]{1,3})(\]?)$&quot;;
    #endregion

    #region Properties
    public IBus _bus { get; set; }
    #endregion

    #region Handle Method

    public void Handle(ValidateEmailRequest message)
    {

        Regex re = new Regex(_strRegex);
        var response = _bus.CreateInstance&lt;ValidateEmailResponse&gt;(attributes =&gt;
        {
            attributes.IsValid = re.IsMatch(message.Email);
        });
        response.CopyHeaderFromRequest(&quot;Test&quot;);
        response.SetHeader(&quot;ValidatedEmail&quot;, message.Email);
        _bus.Reply(response);
    }

    #endregion
}
</pre></p>
<p>En este caso el nServiceBus al recibir un mensaje de tipo <span style="font-family:Consolas, Monaco, 'Courier New', Courier, monospace;font-size:12px;line-height:18px;white-space:pre;">ValidateEmailRequest</span> dispara el <strong><em>handler </em></strong><span style="font-family:Consolas, Monaco, 'Courier New', Courier, monospace;font-size:12px;line-height:18px;white-space:pre;">ValidateEmailHandler</span>.</p>
<h5>El Cliente</h5>
<p>La configuración del cliente es prácticamente igual, solo que en este caso si exponemos un <strong><em>EndPoint</em></strong> indicando cuales mensajes queremos escuchar y por cual cola.</p>
<p><pre class="brush: xml;">
&lt;configSections&gt;
&lt;section name=&quot;MsmqTransportConfig&quot;
            type=&quot;NServiceBus.Config.MsmqTransportConfig, NServiceBus.Core&quot;/&gt;
&lt;section name=&quot;UnicastBusConfig&quot;
            type=&quot;NServiceBus.Config.UnicastBusConfig, NServiceBus.Core&quot;/&gt;
&lt;section name=&quot;RijndaelEncryptionServiceConfig&quot;
            type=&quot;NServiceBus.Config.RijndaelEncryptionServiceConfig, NServiceBus.Core&quot;/&gt;
&lt;/configSections&gt;

&lt;MsmqTransportConfig InputQueue=&quot;MessageClientQueue&quot;
ErrorQueue=&quot;errorClient&quot; NumberOfWorkerThreads=&quot;1&quot; MaxRetries=&quot;5&quot;/&gt;

&lt;UnicastBusConfig&gt;
&lt;MessageEndpointMappings&gt;
&lt;add Messages=&quot;Messages&quot; Endpoint=&quot;MessageServerInputQueue&quot;/&gt;
&lt;/MessageEndpointMappings&gt;
&lt;/UnicastBusConfig&gt;

&lt;RijndaelEncryptionServiceConfig Key=&quot;gdDbqRpqdRbTs3mhdZh9qCaDaxJXl+e7&quot;/&gt;
</pre></p>
<p>La configuración del bus es similar.  Aquí lo único que estoy agregando es un registro a una instancia <strong><em>singleton</em></strong> que actúa de mediador entre los handlers y el GUI.</p>
<p><pre class="brush: csharp;">
            _bus = Configure.With()
                .CastleWindsorBuilder()
                        .RunCustomAction(() =&gt;
              Configure.Instance.Configurer.RegisterSingleton(Mediator.Instance))
                .XmlSerializer()
                .MsmqTransport()
                    .IsTransactional(false)
                    .PurgeOnStartup(false)
                .UnicastBus()
                    .ImpersonateSender(false)
                .LoadMessageHandlers()
                .DoNotAutoSubscribe()//Evita que se auto-subscriba al inicial la aplicación
                .RijndaelEncryptionService()
                .CreateBus()
                .Start();
</pre></p>
<h6>Subscribirse/Des-subscribirse</h6>
<p>Tan simple como decir a qué tipo de mensaje nos estasmos subscribiendo o a cuál nos des-subscribimos</p>
<p><pre class="brush: csharp;">
_bus.Subscribe();
_bus.Unsubscribe();
</pre></p>
<h6>Handlers</h6>
<p>AlertHandler es quien recibe las alertas, en este caso utiliza el mediador para notificar al GUI.</p>
<p><pre class="brush: csharp;">
public class AlertHandler : IHandleMessages
{
    #region Properties
    public IBus Bus { get; set; }
    //Mediator es inyectado por el IoC
    public IFFMediator Mediator { get; set; }
    #endregion

    #region Handle Method

    public void Handle(Alert message)
    {
        Mediator.NotifyMessageAlert(message);
    }

    #endregion

}
</pre></p>
<h6>Request-Response</h6>
<p>Enviamos un mensaje para validar el Email y registramos una acción que se ejecutara al momento de recibir una respuesta.   Igualmente podríamos colocar un handler para que maneje estas respuestas.  Aquí notamos que el registro de la acción está  en otro hilo por ello utilizamos Invoke.</p>
<p><pre class="brush: csharp;">
_bus.Send
                (x =&gt; { x.Email = txtEmailToValidate.Text; }).Register(
                    whenCallback =&gt;
                    {
                        // Saca el email validado de los Headers
                        string email = _bus.CurrentMessageContext.Headers[&quot;ValidatedEmail&quot;];
                        // response message.
                        NServiceBus.CompletionResult completionResult =
                            whenCallback.AsyncState as NServiceBus.CompletionResult;
                        if (completionResult != null)
                        {
                            foreach (var item in completionResult.Messages)
                            {
                                Invoke((Action)(() =&gt;
                                {
                                    lblValidationResult.Text =
                                        ((ValidateEmailResponse)item).IsValid ? &quot;Valid&quot; : &quot;Invalid&quot;;
                                    lblValidatedEmail.Text = email;
                                }));
                            }
                        }
                    }, null);
</pre></p>
<h2>Conclusiones</h2>
<p>La configuración y los ejemplos son bastante simples.  Al principio lo que nos puede costar es entender el concepto y principalmente donde aplica y donde no aplica.</p>
<p><strong>GUI&#8230;</strong></p>
<p>Lo que no me gusta de los ejemplo que vienen con los binarios, es que todos están sobre consola y utilizan  <a href="http://nservicebus.com/GenericHost.aspx" target="_blank">NServiceBus.Host</a>. Al intentar pasarlo a un GUI no nos puede resultar realmente claro que es lo que sucede con los handlers, dado que estos son cargados automáticamente por el bus cuando inicia.  Al suceder de este modo no podemos enlazarlo de una manera directa con nuestra interfaz gráfica ya que no tenemos acceso a este proceso.  <a title="Sacha Barber" href="http://www.sachabarber.net/" target="_blank">Sacha Barber</a> en un <a title="Experimenting with enterprise level bus messaging" href="http://www.codeproject.com/KB/dotnet/nserviceBusDemo.aspx" target="_blank">excelente articulo</a> que escribió en <a title="Code Project" href="http://www.codeproject.com/" target="_blank"><strong><em>Code Project</em></strong></a> comenta un par de formas para lidiar con este tema.  Particularmente me parece interesante una librería que el mismo <a title="Sacha Barber" href="http://www.sachabarber.net" target="_blank">Sacha </a>escribió <a title="Cinch" href="http://cinch.codeplex.com/" target="_blank">cinch</a> y que es una implementación del patrón mediador que viene a resolver este problema.  Igualmente en el mismo foro de nsb, se pueden encontrar algunas otras soluciones.  En el caso del ejemplo se utiliza una solución que <a href="http://www.udidahan.com/">Udi Dahan</a> propone en el articulo de <a title="Sacha Barber" href="http://www.sachabarber.net/" target="_blank">Sacha</a> y que es una implementación simple de una instancia estática que se registra al bus, lo que permite su inyección a los handlers actuando como mediador entre estos y el GUI.</p>
<p><strong>nServiceBus 2.0, 2.5, 3.0 y más allá&#8230;.</strong></p>
<p>El ejemplo está montado con 2.0, el ultimo RTM <em><strong>Open Source</strong></em>, como dije anteriormente el 2.5 ya viene con código propietario y para el 3.0 se esperan grandes cambios entre los principales,  sacarán el nsb de sus limites de LAN y lo ampliarán a la nube, además de mejoras en el TimeOutManager, el Distribuidor entre otros.</p>
<p>Si utilizan Castle Windsor, el nsb viene con la versión 1.1, sin embargo este proyecto ya está en su versión 2.5.2 y se espera la 3.0 para el primer cuatrimestre del 2011.  Para usar otras herramientas que provee el <a title="Castle Project" href="http://www.castleproject.org" target="_blank">Castle Project</a> como los <a title="Castle Facilites" href="http://www.castleproject.org/container/facilities/index.html" target="_blank"><strong><em>facilities</em></strong></a> para la integración con WCF  deberemos bajar las fuentes y re-compilar <em><strong>NServiceBus.ObjectBuilder.CastleWindsor</strong></em>.</p>
<br />  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/ihenrysmith.wordpress.com/23/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/ihenrysmith.wordpress.com/23/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/ihenrysmith.wordpress.com/23/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/ihenrysmith.wordpress.com/23/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/ihenrysmith.wordpress.com/23/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/ihenrysmith.wordpress.com/23/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/ihenrysmith.wordpress.com/23/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/ihenrysmith.wordpress.com/23/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/ihenrysmith.wordpress.com/23/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/ihenrysmith.wordpress.com/23/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/ihenrysmith.wordpress.com/23/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/ihenrysmith.wordpress.com/23/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/ihenrysmith.wordpress.com/23/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/ihenrysmith.wordpress.com/23/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=ihenrysmith.wordpress.com&amp;blog=13060102&amp;post=23&amp;subd=ihenrysmith&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://ihenrysmith.wordpress.com/2010/12/26/iniciando-nservicebus-con-un-ejemplo-en-gui/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	
		<media:content url="http://1.gravatar.com/avatar/ba4c3568ef8cb9561dd7638ef63305b2?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">ihenrysmith</media:title>
		</media:content>
	</item>
		<item>
		<title>Tip: Expresión Regular para remover el número de línea</title>
		<link>http://ihenrysmith.wordpress.com/2010/04/09/tip-expresion-regular-para-remover-el-numero-de-linea/</link>
		<comments>http://ihenrysmith.wordpress.com/2010/04/09/tip-expresion-regular-para-remover-el-numero-de-linea/#comments</comments>
		<pubDate>Fri, 09 Apr 2010 06:41:00 +0000</pubDate>
		<dc:creator>ihenrysmith</dc:creator>
				<category><![CDATA[.net]]></category>
		<category><![CDATA[Expresiones Regulares]]></category>
		<category><![CDATA[notepad++]]></category>
		<category><![CDATA[Regex]]></category>
		<category><![CDATA[Tip]]></category>

		<guid isPermaLink="false">http://ihenrysmith.wordpress.com/2010/04/09/tip-expresion-regular-para-remover-el-numero-de-linea</guid>
		<description><![CDATA[Algunas veces encontramos un código interesante en algún web, pero viene con la útil pero molesta numeración de línea, que al copiarlo se viene en combo. Algo que solemos hacer cuando hacemos una búsqueda es ignorar las expresiones regulares, lo cuál es una pena, ya que aplica en muchas situaciones que pueden volvernos la vida [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=ihenrysmith.wordpress.com&amp;blog=13060102&amp;post=12&amp;subd=ihenrysmith&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p>Algunas veces encontramos un código interesante en algún <i><b>web</b></i>, pero viene con la útil pero molesta numeración de línea, que al copiarlo se viene en combo.</p>
<p>Algo que solemos hacer cuando hacemos una búsqueda es ignorar las expresiones regulares, lo cuál es una pena, ya que aplica en muchas situaciones que pueden volvernos la vida mucho más fácil y el caso de las líneas es un ejemplo claro ya que con una simple expresión regular nos deshacemos ellas al instante.</p>
<p><span style="font-size:large;"><b>Ejemplo</b></span></p>
<p>Yo uso el editor <a href="http://notepad-plus.sourceforge.net/uk/site.htm">notepad++</a> (el cual recomiendo sobre manera) y la expresión a usar sería:<br /><span style="font-size:large;"></span>
<div style="text-align:center;"><b><span style="font-size:large;">^[\s*+\d]+: </span></b></div>
<p>Si usamos Visual Studio sería similar en forma:</p>
<div style="text-align:center;"><b><span style="font-size:large;">^ *[0-9]+\:</span></b></div>
<p>(Notese que hay <b>un espacio en blanco</b> entre <b>^</b> y <b>*</b> )<br />Otro sencillo ejemplo que lo complementa, es remover las líneas en blanco para lo cuál usamos en el Visual Studio: <span style="font-size:large;"><b>^$\n</b></span></p>
<p>Las expresiones regulares son un arte, y es bueno que las incluyamos con más frecuencia en nuestro que hacer diario.&nbsp; Si bien, poco a poco, las herramientas nos facilitan mucho más la vida, <b>no</b> debemos olvidar las expresiones, recordemos el poder de <a href="http://www.gnu.org/software/grep/">grep</a> y <a href="http://www.perl.org/">perl</a>, todo lo que podemos hacer con unas simples lineas bien escritas.</p>
<div style="text-align:right;"><span style="font-size:x-large;"><b><span id="main" style="visibility:visible;"><span id="search" style="visibility:visible;"> /(bb|[^b]{2})/ </span></span></b></span></div>
<br />  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/ihenrysmith.wordpress.com/12/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/ihenrysmith.wordpress.com/12/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/ihenrysmith.wordpress.com/12/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/ihenrysmith.wordpress.com/12/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/ihenrysmith.wordpress.com/12/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/ihenrysmith.wordpress.com/12/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/ihenrysmith.wordpress.com/12/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/ihenrysmith.wordpress.com/12/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/ihenrysmith.wordpress.com/12/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/ihenrysmith.wordpress.com/12/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/ihenrysmith.wordpress.com/12/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/ihenrysmith.wordpress.com/12/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/ihenrysmith.wordpress.com/12/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/ihenrysmith.wordpress.com/12/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=ihenrysmith.wordpress.com&amp;blog=13060102&amp;post=12&amp;subd=ihenrysmith&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://ihenrysmith.wordpress.com/2010/04/09/tip-expresion-regular-para-remover-el-numero-de-linea/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
	
		<media:content url="http://1.gravatar.com/avatar/ba4c3568ef8cb9561dd7638ef63305b2?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">ihenrysmith</media:title>
		</media:content>
	</item>
		<item>
		<title>Mock objects (Objetos Simulados)</title>
		<link>http://ihenrysmith.wordpress.com/2010/03/22/mock-objects-objetos-simulados/</link>
		<comments>http://ihenrysmith.wordpress.com/2010/03/22/mock-objects-objetos-simulados/#comments</comments>
		<pubDate>Mon, 22 Mar 2010 03:55:00 +0000</pubDate>
		<dc:creator>ihenrysmith</dc:creator>
				<category><![CDATA[mock]]></category>
		<category><![CDATA[moq]]></category>
		<category><![CDATA[NUnit]]></category>
		<category><![CDATA[TDD]]></category>
		<category><![CDATA[Test]]></category>

		<guid isPermaLink="false">http://ihenrysmith.wordpress.com/2010/03/22/mock-objects-objetos-simulados</guid>
		<description><![CDATA[Con Mock Objects lo que hacemos es simular el comportamiento de los objetos &#8220;reales&#8221; pero de manera &#8220;controlada&#8221;. Muchas veces cuando queremos crear pruebas para algún objeto nos topamos con el problema de que tiene dependencias, esto nos obliga a buscar la forma para proveerlas, esta situación se puede complicar más cuando estas dependencias aún [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=ihenrysmith.wordpress.com&amp;blog=13060102&amp;post=10&amp;subd=ihenrysmith&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p>Con <span style="font-style:italic;font-weight:bold;">Mock Objects</span> lo que hacemos es simular el comportamiento de los objetos &#8220;reales&#8221; pero de manera &#8220;controlada&#8221;.</p>
<div style="text-align:justify;">
<p>Muchas veces cuando queremos crear pruebas para algún objeto nos topamos con el problema de que tiene dependencias, esto nos obliga a buscar la forma para proveerlas, esta situación se puede complicar más cuando estas dependencias aún no han sido programadas, inclusive , tendiéndolas, nos va a llevar mucho trabajo configurar el contexto y conocer que exactamente se les está suministrando y que es lo que nos están proveyendo. Poco a poco nos vamos metiendo en un desorden de miedo, por ejemplo al fallar una prueba nos va costar determinar si fue el objeto &#8220;<span style="font-style:italic;font-weight:bold;">target</span>&#8221; el que falló o alguna de sus dependencias y de ser este el caso, es algo que realmente <span style="font-style:italic;font-weight:bold;">no</span> nos interesa mucho, ya que <span style="font-weight:bold;">NO</span> son las dependencias las que estamos probando.Para aislar las pruebas, al punto que las podamos hacer realmente unitarias, utilizamos &#8220;<span style="font-style:italic;font-weight:bold;">mocks</span>&#8220;, que permitan grabar el comportamiento del objeto con aquellos con los que tiene relación.   Con los &#8220;<span style="font-style:italic;font-weight:bold;">mocks</span>&#8221; proveemos datos y comportamiento totalmente controlados de manera tal que sabemos exactamente que es lo que le estamos proveyendo al objeto, que nos está mandando y que deberíamos esperar.</p>
<p>En la teoría siempre citan el ejemplo de las pruebas de carros, en donde ponen maniquíes especiales que simulan (&#8220;<span style="font-style:italic;font-weight:bold;">mock</span>&#8220;) personas reales para ver como reaccionan al choque, esto, dado que es imposible probar con personas reales.</p>
<p>Cuando vamos a implementar mocks, salta la pregunta de cuál framework deberíamos usar.  Como es de esperar existen varias opciones, no hay un consenso ya que cada quien tiene su sabor favorito.  Entre los principales frameworks actualmente se encuentran <a href="http://www.nmock.org/">NMock2</a>, <a href="http://code.google.com/p/moq/">Moq</a>, <a href="http://www.ayende.com/projects/rhino-mocks.aspx">Rhino</a>, <a href="http://site.typemock.com/">Isolator</a>. Existen varias comparaciones <a href="http://codevanced.net/post/Mocking-frameworks-comparison.aspx">esta</a> particularmente  es corta y concisa. Lo que puedo decir rápidamente basado en la comparativa: NMock2 es <span style="font-style:italic;font-weight:bold;">&#8220;Type unsafe</span>&#8221; lo que implica que espera <span style="font-style:italic;font-weight:bold;">strings</span> lo cual es algo que particularmente no me gusta ya se vuelve muy desordenado y delicado, además no hay apoyo del <span style="font-style:italic;font-weight:bold;">Intelicense</span>, Moq es el que usamos actualmente y es simple y fácil de aprender ya que es muy intuitivo, recientemente me topé con el problema de que no soporta <span style="font-style:italic;font-weight:bold;">output parameters</span> y los <span style="font-style:italic;font-weight:bold;">callbacks</span> tienen un límite de cuatro parámetros, actualmente hay una versión  en beta.  Rhino si bien no lo he usado mucho he visto que tiene buena aceptación en los foros aunque desde la aparición de Moq ha ido perdiendo terreno.  Isolator no es open source y no es gratuito lo que le hace perder muchos puntos cuando el presupuesto es importante, además, según la comparativa es el más lento.</p>
<p><span style="font-size:130%;"><span style="font-weight:bold;">Ejemplo con Moq</span></span></p>
<p>Moq es relativamente nuevo, pero ha tenido buena aceptación.  Para el ejemplo estoy usando la versión 3.1.416.3 junto con <a href="http://www.nunit.org/"><span style="font-style:italic;font-weight:bold;">NUnit </span></a>2.5.9222 y el .Net Framework 3.5</p>
<p>Supongamos que tenemos un pequeño web que registra usuarios tomando alguna información mínima. Existen dos servicios uno de datos (<span style="font-style:italic;font-weight:bold;">IUserDataService</span>) y otro de formato (<span style="font-style:italic;font-weight:bold;">IUserFormatingService</span>) los cuales son utilizados por un  tercer servicio (<span style="font-style:italic;font-weight:bold;">IUserService</span>) que funciona como un <span style="font-style:italic;font-weight:bold;">facade</span> para juntarlos y dar acceso a las operaciones.</p>
<p><pre class="brush: csharp;">
public interface IUserFormatingService
{
User FormatUserRaw(DataRow row);
}

public interface IUserService
{
int Add(User user);
}

public interface IUserDataService
{
int AddToDB(User user);
bool IsLoginNameAvailable(string LoginName);
}
</pre></p>
<p><span style="font-style:italic;font-weight:bold;">IUserService</span> se encarga de validar el <span style="font-style:italic;font-weight:bold;">DTO User </span>e insertarlo en la Base de Datos, para ello utiliza el método <span style="font-style:italic;font-weight:bold;"> IsLoginNameAvailable</span> para verificar que el Login está disponible y <span style="font-style:italic;font-weight:bold;">AddToDB</span> que se encarga de la inserción propiamente dicha.</p>
<p>La entidad <span style="font-style:italic;font-weight:bold;">User</span> tiene unas pocas propiedades<br />
<pre class="brush: csharp;">
public class User
{
public int ID { get; set; }
public string Name{ get; set; }
public string Login { get; set; }
public string Password { get; set; }
public string Email { get; set; }
public string Country { get; set; }
public double Balance { get; set; }
public DateTime BirthDate { get; set; }
public DateTime SingUpDate { get; set; }
}
</pre></p>
<p>La implementación <span style="font-style:italic;font-weight:bold;">UserService</span>, como curiosidad, podríamos pensar que los dos servicios que está esperando en el constructor son provistos por una entidad aparte que se encarga de inyectarlos y por tanto estamos usando <a href="http://ihenrysmith.blogspot.com/2010/03/inversion-de-control-e-inyeccion-de.html"><span style="font-style:italic;font-weight:bold;">IoC</span></a>.</p>
<p><pre class="brush: csharp;">
public class UserService : IUserService
{
private IUserDataService _userDataService;
private IUserFormatingService _userFormatingService;

public UserService(IUserDataService userDataService,
IUserFormatingService userFormatingService)
{
this._userDataService = userDataService;
this._userFormatingService = userFormatingService;
}

#region IUserService Members

/// &amp;lt;summary&amp;gt;
/// Adds the specified user.
/// &amp;lt;/summary&amp;gt;
/// &amp;lt;param name=&quot;user&quot;&amp;gt;The user.&amp;lt;/param&amp;gt;
/// &amp;lt;returns&amp;gt;The user id&amp;lt;/returns&amp;gt;
public int Add(User user)
{
if (user == null)
{
throw new ArgumentException(&quot;No se ha provisto un usuario&quot;);
}

//NOTE: Si propiedad Login es nula, habrá una
//      excepción no esperada.
if (user.Login.Length &amp;lt; 5)
{
throw
new ArgumentException(&quot;Login deber ser mayor a 5 caracteres.&quot;);
}

if (string.IsNullOrEmpty(user.Name))
{
throw new ArgumentException(&quot;Debe Proveer un Nombre.&quot;);
}

if (CalculateAge(user.BirthDate) &amp;lt; 18)
{
throw
new ArgumentException(&quot;Debe ser mayor de 18 años &quot; +
&quot; para poder registrarse.&quot;);
}

if (!_userDataService.IsLoginNameAvailable(user.Login))
{
throw new ArgumentException(&quot;Login no disponible&quot;);
}

if (!IsEmail(user.Email))
{
throw new ArgumentException(&quot;Email Inválido&quot;);
}

return _userDataService.AddToDB(user);
}

#endregion

</pre></p>
<p>Queremos asegurar que <span style="font-style:italic;font-weight:bold;">UserService </span>funciona correctamente, pero para ello ocuparíamos las dependencias <span style="font-style:italic;font-weight:bold;">IUserDataService </span>y <span style="font-style:italic;font-weight:bold;">IUserFormatingService</span>, que por cierto aún no han sido implementadas y ni siquiera existe una base de datos.  Es, en este punto donde entra <span style="font-style:italic;font-weight:bold;">Moq</span>.  Para ello creamos un proyecto y agregamos una clase <span style="font-style:italic;font-weight:bold;">UserServiceTest </span>que tendrá los tests relacionados con <span style="font-style:italic;font-weight:bold;">UserService</span>, para las dependencias creamos dos &#8220;<span style="font-style:italic;font-weight:bold;">mocks</span>&#8221; con los cuales controlamos que le pasaremos a la clase y que nos está mandando ella.</p>
<p>El método <span style="font-style:italic;font-weight:bold;"> GetUserForTest </span>lo que hace es regresar un usuario válido el cual modificaremos según sea requerido en cada uno de los test.  En el constructor inicializamos el servicio y proveemos los &#8220;<span style="font-style:italic;font-weight:bold;">mocks</span>&#8220;.</p>
<p><pre class="brush: csharp;">

[TestFixture]
public class UserServiceTest
{
private Mock&amp;lt;IUserDataService&amp;gt; _userDataService = new Mock&amp;lt;IUserDataService&amp;gt;();

private Mock&amp;lt;IUserFormatingService&amp;gt; _userFormatingService = new Mock&amp;lt;IUserFormatingService&amp;gt;();

private IUserService _userService;

public UserServiceTest()
{
_userService = new UserService
(_userDataService.Object, _userFormatingService.Object);
}

private User GetUserForTest()
{
User user = new User();
user.Login = &quot;elvis&quot;;
user.Name = &quot;David&quot;;
user.Password = &quot;un_password_compliCAdo&quot;;
user.Email = &quot;test@test.com&quot;;
user.Country = &quot;Costa Rica&quot;;
user.SingUpDate = DateTime.Now;
user.BirthDate = new DateTime(1966, 06, 06);

return user;
}

[Test]
public void Add_User_Test()
{
User user = GetUserForTest();

_userDataService.Setup(x =&amp;gt; x.IsLoginNameAvailable(user.Login)).
Returns(true);
_userDataService.Setup(x =&amp;gt; x.AddToDB(user)).Returns(1);

try
{
int userId = _userService.Add(user);
Assert.AreEqual(1, userId);
}
catch (Exception)
{
Assert.Fail(&quot;No se esperaba ninguna excepción&quot;);
}
}

[Test]
[ExpectedException(typeof(ArgumentException))]
public void Add_User_Login_Short_Lenght()
{
User user = GetUserForTest();

user.Login = &quot;zord&quot;;

_userDataService.Setup(x =&amp;gt;
x.IsLoginNameAvailable(It.IsAny&amp;lt;string&amp;gt;()))
.Returns(true);
_userDataService.Setup(x =&amp;gt; x.AddToDB(user)).Returns(1);

try
{
int userId = _userService.Add(user);
Assert.Fail(&quot;Se esperaba una excepción&quot;);
}
catch (Exception)
{
throw;
}
}

[Test]
[ExpectedException(typeof(ArgumentException))]
public void Add_User_Login_Short_Lenght_BUG()
{
User user = GetUserForTest();
user.Login = null;
_userDataService.Setup(x =&amp;gt;
x.IsLoginNameAvailable(user.Login))
.Returns(true);

_userDataService.Setup(x =&amp;gt; x.AddToDB(user)).Returns(1);

try
{
int userId = _userService.Add(user);
Assert.Fail(&quot;Se esperaba una excepción&quot;);
}
catch (Exception)
{
throw;
}
}
}

</pre></p>
<div style="text-align:justify;">En <span style="font-style:italic;font-weight:bold;">Add_User_Test()</span> y para cada test configuramos los &#8220;<span style="font-style:italic;font-weight:bold;">mocks</span>&#8221; para establecer los  comportamientos requeridos, así por ejemplo <span style="font-style:italic;font-weight:bold;">UserService.Add(User)</span> utiliza de <span style="font-style:italic;font-weight:bold;">IUserDataService </span>los métodos<span style="font-style:italic;font-weight:bold;"> IsLoginNameAvailable </span>que recibe un <span style="font-style:italic;font-weight:bold;">string</span> y regresa un <span style="font-weight:bold;">booleano</span> y <span style="font-style:italic;font-weight:bold;">AddToDB </span>que recibe un <span style="font-style:italic;font-weight:bold;">User</span> y regresa un entero, el cual es el ID asignado.  Para la configuración llamamos el método <span style="font-style:italic;font-weight:bold;">Setup</span> del moq.  Note que en la expresión lambda decimos que de &#8220;x&#8221; vamos a configurar el método  <span style="font-style:italic;font-weight:bold;">IsLoginNameAvailable</span> he indicamos que esperamos en sus parámetros,  cuando reciba <span style="font-style:italic;font-weight:bold;">user.login</span>, se refiere al valor exacto que contenga al momento de la configuración, si el valor <span style="font-weight:bold;">no</span> interesa como en <span style="font-style:italic;font-weight:bold;">Add_User_Login_Short_Lenght </span>usamos un &#8220;<span style="font-style:italic;font-weight:bold;">wildcard</span>&#8221; que indica que cualquier valor <span style="font-style:italic;font-weight:bold;">string </span>es válido =&gt; <span style="font-style:italic;font-weight:bold;">It.IsAny</span><span style="font-style:italic;font-weight:bold;">()</span>, y finalmente con <span style="font-style:italic;font-weight:bold;">Returns</span> indicamos que siempre que se cumplan las condiciones retornaremos <span style="font-style:italic;font-weight:bold;">True</span>.</div>
<div class="csharpcode">
<pre class="alt"><span class="lnum">   1: </span>_userDataService.Setup(x =&gt; x.IsLoginNameAvailable(user.Login)).Returns(<span class="kwrd">true</span>);</pre>
</div>
<p>Lo mismo sucede con <span style="font-style:italic;font-weight:bold;">AddToDB </span>que retornará el id 1 siempre que sea invocada con la instancia &#8220;user&#8221;</p>
<div class="csharpcode">
<pre><span class="lnum">   2: </span>_userDataService.Setup(x =&gt; x.AddToDB(user)).Returns(1);</pre>
</div>
<p>Finalmente implementamos los <span style="font-style:italic;font-weight:bold;">Asserts </span>de <span style="font-style:italic;font-weight:bold;">NUnit</span><span style="font-style:italic;"> </span>para asegurar los valores.</p>
<p><span style="font-size:130%;font-weight:bold;">Un BUG</span></p>
<p>El método <span style="font-style:italic;font-weight:bold;">Add_User_Login_Short_Lenght_BUG</span> intencionalmente contiene un bug, ya que está diseñado para fallar cuando cuando la longitud de la propiedad LoginName es vacía o menor a 5, en cuyo caso se producirá una excepción tipo <span style="font-style:italic;font-weight:bold;">ArgumentException</span>.  Sin embargo la propiedad está nula y al intentar accederla se produce <span style="font-style:italic;font-weight:bold;">System.NullReferenceException</span> lo cual no es un comportamiento esperado y por tanto un BUG del sistema.</p>
<p><a href="http://ihenrysmith.files.wordpress.com/2010/03/capture.png"><img src="http://ihenrysmith.files.wordpress.com/2010/03/capture.png?w=300" border="0" alt="" /></a><br />
Lo primero que debemos hacer al encontrar un bug, antes de arreglarlo es crearle un test, luego corregirlo y de esta manera queda asegurado que si el bug vuelve a aparecer existirá un prueba que nos va decir con anterioridad de la existencia del problema.</p>
<p>Gran parte de la idea de tener pruebas es que nos estén asegurando que el sistema está funcionando correctamente y que los cambios que vamos introduciendo no lo están quebrando.  Si logramos tomar nuestro sistema por unidades y atomizar cada una de las pruebas aseguramos que si cada una funciona como debe en forma individual deben funcionar de manera conjunta y de no ser así, implica que alguna de las partes está fallando y las pruebas no son correctas o  no son las suficientes.</p>
<p><span style="font-size:130%;"><span style="font-weight:bold;">Más Moq </span></span></p>
<p>Algunas otras cosas que podemos hacer con moq.</p>
<p><span style="font-weight:bold;">Parámetros</span></p>
<p>Accesando los parámetros con los cuales se hizo el llamado para el retorno.</p>
<div class="csharpcode">
<pre class="alt"><span class="lnum">   1: </span>_userDataService.Setup(x =&gt; x.AddID(It.IsAny()))</pre>
<pre><span class="lnum">   2: </span>.Returns((<span class="kwrd">string</span> login) =&gt; <span class="kwrd">string</span>.Format(<span class="str">"{0}ID"</span>, login));</pre>
</div>
<p><span style="font-weight:bold;">CallBacks</span></p>
<p>En la línea 2 se llama el callback antes de la invocación del return  y se accesa el argumento miertras en la línea 3 se invoca despues del return</p>
<div class="csharpcode">
<pre class="alt"><span class="lnum">   1: </span>_userDataService.Setup(x =&gt; x.AddToDB(It.IsAny()))</pre>
<pre><span class="lnum">   2: </span>.Callback((User inserUser) =&gt;</pre>
<pre class="alt"><span class="lnum">   3: </span>  Console.WriteLine(<span class="kwrd">string</span>.Format(<span class="str">"Adding user {0}"</span>, inserUser.Login)))</pre>
<pre><span class="lnum">   4: </span>.Returns(1)</pre>
<pre class="alt"><span class="lnum">   5: </span>.Callback(()=&gt; Console.WriteLine(<span class="str">"User Inserted"</span>));</pre>
</div>
<p><span style="font-weight:bold;"><br />
Excepciones</span></p>
<p>Moq puede configurar excepciones según la condición</p>
<div class="csharpcode">
<pre class="alt"><span class="lnum">   1: </span>_userDataService.Setup(x =&gt; x.IsLoginNameAvailable(<span class="kwrd">null</span>))</pre>
<pre><span class="lnum">   2: </span>.Throws(<span class="kwrd">new</span> ArgumentException(<span class="str">"Valor no puede ser nulo"</span>))</pre>
</div>
<p><span style="font-weight:bold;">Matching</span></p>
<p>Como en el ejemplo se pueden usar &#8220;<span style="font-weight:bold;">Matchings</span>&#8221; que indiquen los valores esperados.</p>
<p>Indicar que espera cualquier objeto de tipo User</p>
<div class="csharpcode">
<pre class="alt"><span class="lnum">   1: </span>_userDataService.Setup(x =&gt; x.AddToDB(It.IsAny&lt;User&gt;())).Returns(1);</pre>
</div>
<p>Valida los valores que cumplan con el predicado dado, ósea el valor esperado deber ser string y deber ser igual a &#8220;test&#8221;</p>
<div class="csharpcode">
<pre class="alt"><span class="lnum">   1: </span>_userDataService.Setup(x =&gt; x.IsLoginNameAvailable(It.Is&lt;<span class="kwrd">string</span>&gt;(l =&gt; l.Equals(<span class="str">"Test"</span>))))</pre>
<pre><span class="lnum">   2: </span>.Returns(<span class="kwrd">true</span>);</pre>
</div>
<p>Expresiones Regulares</p>
<div class="csharpcode">
<pre class="alt"><span class="lnum">   1: </span>_userDataService.Setup(x =&gt;</pre>
<pre><span class="lnum">   2: </span>x.IsLoginNameAvailable(It.IsRegex(<span class="str">@"^([a-zA-Z0-9_\-\.]+)"</span>, RegexOptions.IgnoreCase)))</pre>
<pre class="alt"><span class="lnum">   3: </span>.Returns(<span class="kwrd">true</span>);</pre>
</div>
<p>Rangos, ejemplo si queremos usar un número entero que no sea ni el mínimo, ni el máximo</p>
<div class="csharpcode">
<pre class="alt"><span class="lnum">   1: </span>moq.Setup(x =&gt;</pre>
<pre><span class="lnum">   2: </span> x.Ejemplo(It.IsInRange&lt;<span class="kwrd">int</span>&gt;(<span class="kwrd">int</span>.MinValue, <span class="kwrd">int</span>.MaxValue, Range.Exclusive)))</pre>
<pre class="alt"><span class="lnum">   3: </span>.Return(<span class="kwrd">true</span>);</pre>
</div>
<p>Son algunas pocas opciones del framework aun quedan eventos, propiedades, verificaciones, comportamientos, avanzados, etc.  Ejemplos conceptuales los podemos encontrar en <a href="http://code.google.com/p/moq/wiki/QuickStart">QuickStart</a> de la pagina.</p>
</div>
<br />  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/ihenrysmith.wordpress.com/10/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/ihenrysmith.wordpress.com/10/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/ihenrysmith.wordpress.com/10/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/ihenrysmith.wordpress.com/10/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/ihenrysmith.wordpress.com/10/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/ihenrysmith.wordpress.com/10/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/ihenrysmith.wordpress.com/10/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/ihenrysmith.wordpress.com/10/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/ihenrysmith.wordpress.com/10/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/ihenrysmith.wordpress.com/10/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/ihenrysmith.wordpress.com/10/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/ihenrysmith.wordpress.com/10/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/ihenrysmith.wordpress.com/10/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/ihenrysmith.wordpress.com/10/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=ihenrysmith.wordpress.com&amp;blog=13060102&amp;post=10&amp;subd=ihenrysmith&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://ihenrysmith.wordpress.com/2010/03/22/mock-objects-objetos-simulados/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	
		<media:content url="http://1.gravatar.com/avatar/ba4c3568ef8cb9561dd7638ef63305b2?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">ihenrysmith</media:title>
		</media:content>

		<media:content url="http://ihenrysmith.files.wordpress.com/2010/03/capture.png?w=300" medium="image" />
	</item>
		<item>
		<title>Inversión de Control e Inyección de dependencias</title>
		<link>http://ihenrysmith.wordpress.com/2010/03/14/inversion-de-control-e-inyeccion-de-dependencias/</link>
		<comments>http://ihenrysmith.wordpress.com/2010/03/14/inversion-de-control-e-inyeccion-de-dependencias/#comments</comments>
		<pubDate>Sun, 14 Mar 2010 20:32:00 +0000</pubDate>
		<dc:creator>ihenrysmith</dc:creator>
				<category><![CDATA[Castle Windsor]]></category>
		<category><![CDATA[DI]]></category>
		<category><![CDATA[Inyección de dependencias]]></category>
		<category><![CDATA[IoC]]></category>

		<guid isPermaLink="false">http://ihenrysmith.wordpress.com/2010/03/14/inversion-de-control-e-inyeccion-de-dependencias</guid>
		<description><![CDATA[Inversión de control e inyección de dependencia son términos que se confunden constantemente, vale la pena aclarar desde el inicio que la inyección de dependencia es una forma de implementar la inversión de control, de la misma forma existen otras implementaciones con, por ejemplo, el patrón “Factory” o el “service locator”. La característica principal de [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=ihenrysmith.wordpress.com&amp;blog=13060102&amp;post=9&amp;subd=ihenrysmith&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p><!--   @page { margin: 0.79in }   P { margin-bottom: 0.08in }  -->
<p style="margin-bottom:0;">Inversión  de control e inyección de dependencia son términos que se confunden constantemente, vale la pena aclarar desde el inicio que la inyección de dependencia es una forma de implementar la inversión de control, de la misma forma existen otras implementaciones con, por ejemplo, el patrón “<i><b>Factory</b></i>” o el “<i><b>service locator</b></i>”.</p>
<p style="margin-bottom:0;">La característica principal de la inversión de control es que el control del flujo es invertido con respecto a los métodos tradicionales.  En vez de tener un código central que lo controle, indicamos que es lo que estamos esperando, para que una entidad aparte se encargue de proveerlo, así, es esta entidad quien decide como y cuando proveer lo esperado. En pocas palabras, nuestro código es el llamado, y no como  ocurre comúnmente, cuando nuestro código es quien tiene el control del flujo y lo que hace es hacer llamadas. Se dice que es una implementación del Principio de Hollywood “No llame, nosotros le llamamos”.</p>
<p style="margin-bottom:0;">Para obtener flexibilidad, “<i>testeabilidad</i>” y reutilización, debemos buscar siempre el menor acoplamiento posible.  Si hacemos este acoplamiento por medio de interfaces y utilizamos una entidad aparte para que nos provea la implementación concreta, nos simplificamos sobre manera cambios futuros,  ya que solo deberíamos cambiar la implementación sin tener que modificar en lo absoluto el objeto dependiente.</p>
<p style="margin-bottom:0;">Estando claros que la inyección de dependencia es una forma específica de implementar inversión de control.  Podríamos decir que lo que haremos es “inyectar” los objetos necesarios, según una configuración previa, evitando que sea la misma clase quien se encargue de crearlos u obtenerlos, así nos desentendemos de manejar su implementación por completo, ósea, no nos preocupamos por su ciclo de vida del todo.  Usualmente utilizaremos un contenedor que se encargue de todo lo referente a la inyección propiamente dicha (creación, inyección, dependencias, destrucción, etc), si este contenedor esta externo podríamos decir que estamos utilizando inversión de control.</p>
<p style="margin-bottom:0;">      <!--   @page { margin: 0.79in }   P { margin-bottom: 0.08in }  -->    </p>
<p style="margin-bottom:0;">Con una comprensión más clara de los conceptos, que de alguna forma, es muy posible ya estemos aplicando, estaremos en posibilidad de escribir código más desacoplado, flexible y sobre todo reutilizable.</p>
</p>
<p style="margin-bottom:0;">
<p style="margin-bottom:0;">
<p style="margin-bottom:0;">
<br />  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/ihenrysmith.wordpress.com/9/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/ihenrysmith.wordpress.com/9/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/ihenrysmith.wordpress.com/9/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/ihenrysmith.wordpress.com/9/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/ihenrysmith.wordpress.com/9/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/ihenrysmith.wordpress.com/9/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/ihenrysmith.wordpress.com/9/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/ihenrysmith.wordpress.com/9/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/ihenrysmith.wordpress.com/9/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/ihenrysmith.wordpress.com/9/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/ihenrysmith.wordpress.com/9/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/ihenrysmith.wordpress.com/9/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/ihenrysmith.wordpress.com/9/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/ihenrysmith.wordpress.com/9/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=ihenrysmith.wordpress.com&amp;blog=13060102&amp;post=9&amp;subd=ihenrysmith&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://ihenrysmith.wordpress.com/2010/03/14/inversion-de-control-e-inyeccion-de-dependencias/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	
		<media:content url="http://1.gravatar.com/avatar/ba4c3568ef8cb9561dd7638ef63305b2?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">ihenrysmith</media:title>
		</media:content>
	</item>
		<item>
		<title>Contenedor IoC</title>
		<link>http://ihenrysmith.wordpress.com/2010/03/13/contenedor-ioc/</link>
		<comments>http://ihenrysmith.wordpress.com/2010/03/13/contenedor-ioc/#comments</comments>
		<pubDate>Sat, 13 Mar 2010 18:44:00 +0000</pubDate>
		<dc:creator>ihenrysmith</dc:creator>
				<category><![CDATA[ASP.Net]]></category>
		<category><![CDATA[Castle Windsor]]></category>
		<category><![CDATA[IoC]]></category>
		<category><![CDATA[MVC]]></category>
		<category><![CDATA[Spring.NET]]></category>

		<guid isPermaLink="false">http://ihenrysmith.wordpress.com/2010/03/13/contenedor-ioc</guid>
		<description><![CDATA[Cuando decidimos utilizar IoC (&#8220;Inversion of Control&#8221; &#8211; Inversión de Control) ocupamos un Contenedor o en otras palabras un software, en el cual podamos registrar nuestros objetos ya sea por medio de un archivo de configuración (usualmente XML) o desde el código mismo y que sea este quien se encargue de la inicialización de los [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=ihenrysmith.wordpress.com&amp;blog=13060102&amp;post=8&amp;subd=ihenrysmith&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p>Cuando decidimos utilizar <span style="font-style:italic;"><a href="http://ihenrysmith.blogspot.com/2010/03/contenedor-ioc.html">IoC</a> </span>(<span style="font-style:italic;">&#8220;Inversion of Control&#8221;</span> &#8211; Inversión de Control) ocupamos un Contenedor o en otras palabras un software, en el cual podamos registrar nuestros objetos ya sea por medio de un archivo de configuración (usualmente XML) o desde el código mismo y que sea este quien se encargue de la inicialización de los objetos que estamos esperando.   La idea es que podamos tomar ya sea una clase abstracta o una Interfase y pedirle al contenedor que nos resuelva la instancia concreta deacuerdo con la definición esperada. <a href="http://blog.stevensanderson.com/about/"> <span style="font-style:italic;">Steven Sanderson</span></a> en su libro <a href="http://www.amazon.com/gp/product/1430210079?ie=UTF8&amp;tag=stesansblo-20&amp;linkCode=as2&amp;camp=1789&amp;creative=9325&amp;creativeASIN=1430210079">Pro ASP.NET MVCFramework</a> (el cual les recomiendo) añade que un buen contenedor debe contar con tres características extra más allá de simplemente resolver la inicialización de la instancia.</p>
<p>Esta tres características son:</p>
<ul>
<li><span style="font-weight:bold;">Resolución de dependencias en cadena</span>: Lo que implica que si se esta resolviendo la dependencia de un objeto que requiere de otro, el contenedor debe ser capaz de proveer la dependencia requerida.</li>
<li><span style="font-weight:bold;">Tiempo de vida de los objetos</span>: Debe encargarse de mantener el estilo de vida de los objetos. Si una instancia es solicitada más de una vez, el contenedor deberá escoger entre varias opciones, por ejemplo mantener una única instancia para todas las solicitudes (<span style="font-style:italic;">singleton</span>), o crear una nueva por solicitud (<span style="font-style:italic;">transient</span>), entre otras. Esto es lo que se conoce como el &#8220;<span style="font-style:italic;">lifestyle</span>&#8221; del objeto, hay varias opciones predefinidas como <span style="font-style:italic;">singleton (</span>que es la default<span style="font-style:italic;">)</span>, <span style="font-style:italic;">thread</span>, <span style="font-style:italic;">transient</span>, <span style="font-style:italic;">pooled</span> y customizadas como <span style="font-style:italic;">PerWebRequest</span>.</li>
<li><span style="font-weight:bold;">Valores de parámetros explícitos para los constructores</span>: Esto quiere decir que si un constructor que debe inicializar el contenedor requiere de parámetros, deber existir un medio en la configuración que permita proveer los valores.  El ejemplo clásico es el  <span style="font-style:italic;">ConnectionString </span>para el acceso a datos o el servidor<span style="font-style:italic;"> SMTP </span><span>para enviar correos.<br /></span></li>
</ul>
<p>Otra parte complicada es escoger cual de los contenedores disponibles actualmente vamos a usar.   Entre los más comunes se encuentran:
<ul>
<li>Castle Windsor (El que usamos actualmente)</li>
<li>Spring.NET</li>
<li>StructureMap</li>
<li>Unity</li>
<li>Puzzle.NFactory </li>
</ul>
<p>Después de una rápida vista por google, nos damos cuenta  lo difícil que es escoger alguno, a Spring por ejemplo se le achaca la poca documentación y el echo que sea portado de Java.  Muchos tienden a usar Castle Windsor por su documentación y se podría decir que es el más popular en este momento.</p>
<p>Hay que recordar que utilizar un Contenedor puede provocar un poco de &#8220;<span style="font-style:italic;">overhead</span>&#8220;en la creación de los objetos,  pero esto es compensado con todas la facilidades que su uso implica.</p>
<br />  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/ihenrysmith.wordpress.com/8/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/ihenrysmith.wordpress.com/8/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/ihenrysmith.wordpress.com/8/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/ihenrysmith.wordpress.com/8/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/ihenrysmith.wordpress.com/8/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/ihenrysmith.wordpress.com/8/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/ihenrysmith.wordpress.com/8/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/ihenrysmith.wordpress.com/8/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/ihenrysmith.wordpress.com/8/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/ihenrysmith.wordpress.com/8/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/ihenrysmith.wordpress.com/8/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/ihenrysmith.wordpress.com/8/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/ihenrysmith.wordpress.com/8/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/ihenrysmith.wordpress.com/8/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=ihenrysmith.wordpress.com&amp;blog=13060102&amp;post=8&amp;subd=ihenrysmith&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://ihenrysmith.wordpress.com/2010/03/13/contenedor-ioc/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	
		<media:content url="http://1.gravatar.com/avatar/ba4c3568ef8cb9561dd7638ef63305b2?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">ihenrysmith</media:title>
		</media:content>
	</item>
		<item>
		<title>Again??</title>
		<link>http://ihenrysmith.wordpress.com/2010/03/01/again/</link>
		<comments>http://ihenrysmith.wordpress.com/2010/03/01/again/#comments</comments>
		<pubDate>Mon, 01 Mar 2010 04:30:00 +0000</pubDate>
		<dc:creator>ihenrysmith</dc:creator>
				<category><![CDATA[Personal]]></category>

		<guid isPermaLink="false">http://ihenrysmith.wordpress.com/2010/03/01/again</guid>
		<description><![CDATA[Parece que de verdad olvide esto :p&#8230;.. pero en el futuro prometo meter algunas otras entras &#8230;.:p<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=ihenrysmith.wordpress.com&amp;blog=13060102&amp;post=7&amp;subd=ihenrysmith&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p>Parece que de verdad olvide esto :p&#8230;.. pero en el futuro prometo meter algunas otras entras &#8230;.:p</p>
<br />  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/ihenrysmith.wordpress.com/7/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/ihenrysmith.wordpress.com/7/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/ihenrysmith.wordpress.com/7/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/ihenrysmith.wordpress.com/7/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/ihenrysmith.wordpress.com/7/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/ihenrysmith.wordpress.com/7/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/ihenrysmith.wordpress.com/7/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/ihenrysmith.wordpress.com/7/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/ihenrysmith.wordpress.com/7/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/ihenrysmith.wordpress.com/7/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/ihenrysmith.wordpress.com/7/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/ihenrysmith.wordpress.com/7/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/ihenrysmith.wordpress.com/7/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/ihenrysmith.wordpress.com/7/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=ihenrysmith.wordpress.com&amp;blog=13060102&amp;post=7&amp;subd=ihenrysmith&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://ihenrysmith.wordpress.com/2010/03/01/again/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	
		<media:content url="http://1.gravatar.com/avatar/ba4c3568ef8cb9561dd7638ef63305b2?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">ihenrysmith</media:title>
		</media:content>
	</item>
		<item>
		<title>El Génesis..</title>
		<link>http://ihenrysmith.wordpress.com/2008/09/12/el-genesis/</link>
		<comments>http://ihenrysmith.wordpress.com/2008/09/12/el-genesis/#comments</comments>
		<pubDate>Fri, 12 Sep 2008 21:25:00 +0000</pubDate>
		<dc:creator>ihenrysmith</dc:creator>
				<category><![CDATA[Personal]]></category>

		<guid isPermaLink="false">http://ihenrysmith.wordpress.com/2008/09/12/el-genesis</guid>
		<description><![CDATA[Conforme tenga tiempo espero poder publicar cosas de interés sobre tecnologías de programación relacionadas a los proyectos en que trabajo y demás pasatiempos personales… Cosas como Java, Javascript, C#, C++, SQL server, Pascal, entre otros&#8230;. Sin mas por el momento, me despido!<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=ihenrysmith.wordpress.com&amp;blog=13060102&amp;post=4&amp;subd=ihenrysmith&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p>Conforme tenga tiempo espero poder publicar cosas de interés sobre tecnologías de programación relacionadas a los proyectos en que trabajo y demás pasatiempos personales… Cosas como Java, Javascript, C#, C++, SQL server, Pascal, entre otros&#8230;.</p>
<p>Sin mas por el momento, me despido!</p>
<br /><img alt="" border="0" src="http://feeds.wordpress.com/1.0/categories/ihenrysmith.wordpress.com/4/" /> <img alt="" border="0" src="http://feeds.wordpress.com/1.0/tags/ihenrysmith.wordpress.com/4/" /> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/ihenrysmith.wordpress.com/4/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/ihenrysmith.wordpress.com/4/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/ihenrysmith.wordpress.com/4/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/ihenrysmith.wordpress.com/4/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/ihenrysmith.wordpress.com/4/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/ihenrysmith.wordpress.com/4/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/ihenrysmith.wordpress.com/4/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/ihenrysmith.wordpress.com/4/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/ihenrysmith.wordpress.com/4/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/ihenrysmith.wordpress.com/4/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/ihenrysmith.wordpress.com/4/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/ihenrysmith.wordpress.com/4/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/ihenrysmith.wordpress.com/4/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/ihenrysmith.wordpress.com/4/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=ihenrysmith.wordpress.com&amp;blog=13060102&amp;post=4&amp;subd=ihenrysmith&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://ihenrysmith.wordpress.com/2008/09/12/el-genesis/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
	
		<media:content url="http://1.gravatar.com/avatar/ba4c3568ef8cb9561dd7638ef63305b2?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">ihenrysmith</media:title>
		</media:content>
	</item>
	</channel>
</rss>
