<?xml version="1.0" encoding="utf-8"?><?xml-stylesheet type='text/xsl' href='http://lucasontivero.spaces.live.com/mmm2008-07-24_12.50/rsspretty.aspx?rssquery=en-US;http%3a%2f%2flucasontivero.spaces.live.com%2fcategory%2f__x1NET%2ffeed.rss' version='1.0'?><rss version="2.0" xmlns:slash="http://purl.org/rss/1.0/modules/slash/" xmlns:msn="http://schemas.microsoft.com/msn/spaces/2005/rss" xmlns:live="http://schemas.microsoft.com/live/spaces/2006/rss" xmlns:dcterms="http://purl.org/dc/terms/" xmlns:cf="http://www.microsoft.com/schemas/rss/core/2005" xmlns:wfw="http://wellformedweb.org/CommentAPI/"><channel><title>Lucas Ontivero: .NET</title><description /><link>http://lucasontivero.spaces.live.com/?_c11_BlogPart_BlogPart=blogview&amp;_c=BlogPart&amp;partqs=cat__x1NET</link><language>en-US</language><pubDate>Fri, 15 Aug 2008 15:15:42 GMT</pubDate><lastBuildDate>Fri, 15 Aug 2008 15:15:42 GMT</lastBuildDate><generator>Microsoft Spaces v1.1</generator><docs>http://www.rssboard.org/rss-specification</docs><ttl>60</ttl><cf:parentRSS>http://lucasontivero.spaces.live.com/blog/feed.rss</cf:parentRSS><live:type>blogcategory</live:type><live:identity><live:id>3988747590285877710</live:id><live:alias>lucasontivero</live:alias></live:identity><cf:listinfo><cf:group ns="http://schemas.microsoft.com/live/spaces/2006/rss" element="typelabel" label="Type" /><cf:group ns="http://schemas.microsoft.com/live/spaces/2006/rss" element="tag" label="Tag" /><cf:group element="category" label="Category" /><cf:sort element="pubDate" label="Date" data-type="date" default="true" /><cf:sort element="title" label="Title" data-type="string" /><cf:sort ns="http://purl.org/rss/1.0/modules/slash/" element="comments" label="Comments" data-type="number" /></cf:listinfo><item><title>[Benchmark] Reflection Performance</title><link>http://lucasontivero.spaces.live.com/Blog/cns!375AE0CCD1AF61CE!440.entry</link><description>&lt;img style="margin:10px" src="http://byfiles.storage.live.com/y1pmVarknuftX1uaViMlHixhwkSm7gGR8t2P0_1FX3Df2w5B0Bxubcy3lF7AkshaNUVxKjpNJStEGA" align=left&gt; 
&lt;div&gt;&lt;font face=Arial color="#c00000" size=3&gt;&lt;a href="http://www.google.com/translate?u=http://lucasontivero.spaces.live.com/blog/cns!375AE0CCD1AF61CE!440.entry&amp;amp;langpair=es|en&amp;amp;hl=en&amp;amp;ie=UTF8"&gt;[Tanslate this post to english with google]&lt;/a&gt;&lt;/font&gt;&lt;/div&gt;
&lt;div&gt;Escribiendo el próximo post sobre el patrón DataMapper mediante reflection (lo estoy cocinando) me puse a pensar en una lista de pros y contras como así también, algunos escenarios en donde yo lo implementaria y en donde no. Entre los argumentos en contra seguramente debía figurar el hecho de que reflection tiene un costo que hay que evaluar. Yo pensaba que este argumento bien podría ponerse en la balanza junto con todos los beneficios de este patrón y pensaba argumentar también que si bien, el uso de reflection es caro, tampoco es una locura.&lt;/div&gt;
&lt;div&gt;Pero después me saltó la duda, cuan lento puede ser el uso de reflecion en comparación con un acceso convencional? Así que primero tiré un número a la mancancha, &amp;quot;debe ser 6 o 7 veces mas lento...&amp;quot; pensé.  Y me puse a buscar en google, encontré &lt;a href="http://www.manuelabadia.com/blog/PermaLink,guid,772c7152-b00e-4334-b677-bfbdcd8e6b5d.aspx" target="_blank"&gt;este blog &lt;/a&gt;y &lt;a href="http://msdn.microsoft.com/msdnmag/issues/05/07/Reflection/default.aspx" target="_blank"&gt;este muy buen artículo&lt;/a&gt; y &lt;a href="http://west-wind.com/WebLog/posts/351.aspx" target="_blank"&gt;este otro blog&lt;/a&gt; que que aunque también hace la prueba parece que el benchmark está distorcionado porque lo hace con una aplicación winform en la que existen al menos dos threads compitiendo (UI y el que corre nuestro código). &lt;/div&gt;
&lt;div&gt;Pero después me acordé de un proyecto que abusaba tanto de esta técnica que tardaba 3 minutos en arrancar!! Así que tiré otro número, &amp;quot;nooo, debe ser como 100 veces más lento&amp;quot;. Así que hice mi propia prueba solo seteando un field, una property e invocando un método y los números me dieron la razón, en estos caso es mucho más lento. &lt;/div&gt;
&lt;div&gt; &lt;/div&gt;
&lt;div&gt;Los números:&lt;/div&gt;
&lt;div&gt; &lt;img src="http://byfiles.storage.live.com/y1pmVarknuftX1PZ1HwGq2ltCSL2Bl36E68uLiP1tmrsAtW3wgx2Fp2gKUeDcv97YLLmm_pckFIC3c"&gt; &lt;img src="http://byfiles.storage.live.com/y1pmVarknuftX39lGOdriSDCVNoN5CLddM2JMy9l9LtTavcub8O8YHjbXJf3vOGphBPTJCzUwswGBo"&gt; &lt;/div&gt;
&lt;p&gt;En un Pentium 4 de 2.8GHz y 1 GB de RAM / Windows XP PE SP2. 
&lt;p&gt;&lt;img src="http://byfiles.storage.live.com/y1pmVarknuftX0XnyvoE4e2hjm-mBNlJPmNLOg0W48vnHNfRYv03NsmJgAGc-xPCpNQ7BQ5OMreAUE"&gt; 
&lt;div&gt;El mismo test (con bucles más chicos para irme a dormir más temprano) pero en un ADM 2800 con 512 de RAM /W2003 Server PE dió el resultado de arriba.&lt;/div&gt;
&lt;div&gt; &lt;/div&gt;
&lt;div&gt;Si se corre este test más de una vez se obtienen resultados similares aunque distintos por varias razones, en primer lugar este test compite con las otras aplicaciones por el tiempo de ejecución por lo que nunca sabemos en que parte del código el S.O. nos interrumpe, otra cosa que distorciona es el hecho de que las operaciones de acceso directo a los campos, propiedades y métodos son más rápidas por lo que tienen menos posibilidades de ser interrumpidas por el planificador del SO. Esto último hace que a veces se obtengan brechas mayores a las que se muestran.&lt;/div&gt;
&lt;div&gt; &lt;/div&gt;
&lt;div&gt;En síntesis, reflection es, al menos en estas operaciones, unas cientos de veces más lento que un acceso &amp;quot;común&amp;quot;. También lo corrí poniendo el proceso con prioridad Hight y obtuve resultados similares.&lt;/div&gt;
&lt;div&gt; &lt;/div&gt;
&lt;div&gt;Pueden impugnar este benchmark si ven algo que esté mal. Acá va el código:&lt;/div&gt;
&lt;div&gt; &lt;/div&gt;&lt;pre style="border-right:#eee 1px solid;padding-right:5px;border-top:#eee 1px solid;padding-left:5px;font-size:12px;padding-bottom:20px;overflow:auto;border-left:#eee 1px solid;width:95%;padding-top:5px;border-bottom:#eee 1px solid;font-family:courier new;height:500px;background-color:#fff"&gt;&lt;font color=blue&gt;using&lt;/font&gt; System;
&lt;font color=blue&gt;using&lt;/font&gt; System.Text;
&lt;font color=blue&gt;using&lt;/font&gt; System.Reflection;

&lt;font color=blue&gt;namespace&lt;/font&gt; Temosoft.Benchmarks
{
        &lt;font color=blue&gt;class&lt;/font&gt; Program
        {
                &lt;font color=blue&gt;static&lt;/font&gt; &lt;font color=blue&gt;void&lt;/font&gt; Main(&lt;font color=blue&gt;string&lt;/font&gt;[] args)
                {
                        DateTime startDate;
                        TimeSpan ts;
                        &lt;font color=blue&gt;int&lt;/font&gt; max = 10000000; &lt;font color=green&gt;//int.MaxValue;&lt;/font&gt;

                        TestClass t = &lt;font color=blue&gt;new&lt;/font&gt; TestClass();

                        System.Console.WriteLine(&amp;quot;&lt;font color=magenta&gt;----- FIELDS ------&lt;/font&gt;&amp;quot;);
                        startDate = DateTime.Now;
                        &lt;font color=blue&gt;for&lt;/font&gt; (&lt;font color=blue&gt;int&lt;/font&gt; i = 0; i &amp;lt; max; i++)
                        {
                                t.field = i;
                        }
                        ts = DateTime.Now.Subtract(startDate);
                        System.Console.WriteLine(&amp;quot;&lt;font color=magenta&gt;{0, -42}: {1}&lt;/font&gt;&amp;quot;, &amp;quot;&lt;font color=magenta&gt;obj.field = i;&lt;/font&gt;&amp;quot;, ts.Ticks);


                        Type type = &lt;font color=blue&gt;typeof&lt;/font&gt;(TestClass);
                        FieldInfo fi = type.GetField(&amp;quot;&lt;font color=magenta&gt;field&lt;/font&gt;&amp;quot;);
                        startDate = DateTime.Now;
                        &lt;font color=blue&gt;for&lt;/font&gt; (&lt;font color=blue&gt;int&lt;/font&gt; i = 0; i &amp;lt; max; i++)
                        {
                                fi.SetValue(t, i);
                        }
                        ts = DateTime.Now.Subtract(startDate);
                        System.Console.WriteLine(&amp;quot;&lt;font color=magenta&gt;{0, -42}: {1}&lt;/font&gt;&amp;quot;, &amp;quot;&lt;font color=magenta&gt;fieldInfo.SetValue(t, i);&lt;/font&gt;&amp;quot;, ts.Ticks);


                        startDate = DateTime.Now;
                        &lt;font color=blue&gt;for&lt;/font&gt; (&lt;font color=blue&gt;int&lt;/font&gt; i = 0; i &amp;lt; max; i++)
                        {
                                &lt;font color=blue&gt;typeof&lt;/font&gt;(TestClass).GetField(&amp;quot;&lt;font color=magenta&gt;field&lt;/font&gt;&amp;quot;).SetValue(t, i);
                        }
                        ts = DateTime.Now.Subtract(startDate);
                        System.Console.WriteLine(&amp;quot;&lt;font color=magenta&gt;{0, -42}: {1}&lt;/font&gt;&amp;quot;, &amp;quot;&lt;font color=magenta&gt;typeof(TestClass).GetField(\&amp;quot;field\&amp;quot;).SetValue(t, i);&lt;/font&gt;&amp;quot;, ts.Ticks);


                        System.Console.WriteLine(&amp;quot;&lt;font color=magenta&gt;----- PROPERTIES --&lt;/font&gt;&amp;quot;);
                        startDate = DateTime.Now;
                        &lt;font color=blue&gt;for&lt;/font&gt; (&lt;font color=blue&gt;int&lt;/font&gt; i = 0; i &amp;lt; max; i++)
                        {
                                t.Field = i;
                        }
                        ts = DateTime.Now.Subtract(startDate);
                        System.Console.WriteLine(&amp;quot;&lt;font color=magenta&gt;{0, -42}: {1}&lt;/font&gt;&amp;quot;, &amp;quot;&lt;font color=magenta&gt;obj.Property = i;&lt;/font&gt;&amp;quot;, ts.Ticks);


                        PropertyInfo pi = type.GetProperty(&amp;quot;&lt;font color=magenta&gt;Field&lt;/font&gt;&amp;quot;);
                        startDate = DateTime.Now;
                        &lt;font color=blue&gt;for&lt;/font&gt; (&lt;font color=blue&gt;int&lt;/font&gt; i = 0; i &amp;lt; max; i++)
                        {
                                pi.SetValue(t, i, &lt;font color=blue&gt;null&lt;/font&gt;);
                        }
                        ts = DateTime.Now.Subtract(startDate);
                        System.Console.WriteLine(&amp;quot;&lt;font color=magenta&gt;{0, -42}: {1}&lt;/font&gt;&amp;quot;, &amp;quot;&lt;font color=magenta&gt;propertyInfo.SetValue(t, i);&lt;/font&gt;&amp;quot;, ts.Ticks);


                        startDate = DateTime.Now;
                        &lt;font color=blue&gt;for&lt;/font&gt; (&lt;font color=blue&gt;int&lt;/font&gt; i = 0; i &amp;lt; max; i++)
                        {
                                &lt;font color=blue&gt;typeof&lt;/font&gt;(TestClass).GetProperty(&amp;quot;&lt;font color=magenta&gt;Field&lt;/font&gt;&amp;quot;).SetValue(t, i, &lt;font color=blue&gt;null&lt;/font&gt;);
                        }
                        ts = DateTime.Now.Subtract(startDate);
                        System.Console.WriteLine(&amp;quot;&lt;font color=magenta&gt;{0, -42}: {1}&lt;/font&gt;&amp;quot;, &amp;quot;&lt;font color=magenta&gt;typeof(TestClass).GetProperty(\&amp;quot;Field\&amp;quot;).SetValue(t, i, null);&lt;/font&gt;&amp;quot;, ts.Ticks);


                        System.Console.WriteLine(&amp;quot;&lt;font color=magenta&gt;----- METHODS --&lt;/font&gt;&amp;quot;);
                        startDate = DateTime.Now;
                        &lt;font color=blue&gt;for&lt;/font&gt; (&lt;font color=blue&gt;int&lt;/font&gt; i = 0; i &amp;lt; max; i++)
                        {
                                t.Method1(i);
                        }
                        ts = DateTime.Now.Subtract(startDate);
                        System.Console.WriteLine(&amp;quot;&lt;font color=magenta&gt;{0, -42}: {1}&lt;/font&gt;&amp;quot;, &amp;quot;&lt;font color=magenta&gt;obj.Method(i);&lt;/font&gt;&amp;quot;, ts.Ticks);


                        MethodInfo mi = type.GetMethod(&amp;quot;&lt;font color=magenta&gt;Method1&lt;/font&gt;&amp;quot;);
                        startDate = DateTime.Now;
                        &lt;font color=blue&gt;for&lt;/font&gt; (&lt;font color=blue&gt;int&lt;/font&gt; i = 0; i &amp;lt; max; i++)
                        {
                                mi.Invoke(t, &lt;font color=blue&gt;new&lt;/font&gt; &lt;font color=blue&gt;object&lt;/font&gt;[]{i} );
                        }
                        ts = DateTime.Now.Subtract(startDate);
                        System.Console.WriteLine(&amp;quot;&lt;font color=magenta&gt;{0, -42}: {1}&lt;/font&gt;&amp;quot;, &amp;quot;&lt;font color=magenta&gt;methodInfo.Invoke(t, new object[]{i} );&lt;/font&gt;&amp;quot;, ts.Ticks);


                        mi = type.GetMethod(&amp;quot;&lt;font color=magenta&gt;Method2&lt;/font&gt;&amp;quot;);
                        startDate = DateTime.Now;
                        &lt;font color=blue&gt;for&lt;/font&gt; (&lt;font color=blue&gt;int&lt;/font&gt; i = 0; i &amp;lt; max; i++)
                        {
                                mi.Invoke(t, &lt;font color=blue&gt;new&lt;/font&gt; &lt;font color=blue&gt;object&lt;/font&gt;[] { i, i, i, i, i, i });
                        }
                        ts = DateTime.Now.Subtract(startDate);
                        System.Console.WriteLine(&amp;quot;&lt;font color=magenta&gt;{0, -42}: {1}&lt;/font&gt;&amp;quot;, &amp;quot;&lt;font color=magenta&gt;methodInfo.Invoke(t, new object[] { i, i, i, i, i, i });&lt;/font&gt;&amp;quot;, ts.Ticks);

                        System.Console.ReadLine();
                }
        }

        &lt;font color=blue&gt;class&lt;/font&gt; TestClass
        {
                &lt;font color=blue&gt;public&lt;/font&gt; &lt;font color=blue&gt;int&lt;/font&gt; field;
                &lt;font color=blue&gt;public&lt;/font&gt; &lt;font color=blue&gt;int&lt;/font&gt; Field
                {
                        set { field = value; }
                        get { &lt;font color=blue&gt;return&lt;/font&gt; field; }
                }

                &lt;font color=blue&gt;public&lt;/font&gt; &lt;font color=blue&gt;void&lt;/font&gt; Method1(&lt;font color=blue&gt;int&lt;/font&gt; i)
                {
                        field = i;
                }

                &lt;font color=blue&gt;public&lt;/font&gt; &lt;font color=blue&gt;void&lt;/font&gt; Method2(&lt;font color=blue&gt;int&lt;/font&gt; i, &lt;font color=blue&gt;int&lt;/font&gt; j, &lt;font color=blue&gt;int&lt;/font&gt; k, &lt;font color=blue&gt;int&lt;/font&gt; l, &lt;font color=blue&gt;int&lt;/font&gt; m, &lt;font color=blue&gt;int&lt;/font&gt; n)
                {
                        field = i;
                }

        }
}&lt;/pre&gt;
&lt;p&gt;&lt;strong&gt;Lucas Ontivero&lt;/strong&gt;&lt;img src="http://c.services.spaces.live.com/CollectionWebService/c.gif?cid=3988747590285877710&amp;page=RSS%3a+%5bBenchmark%5d+Reflection+Performance&amp;referrer=" width="1px" height="1px" border="0" alt=""&gt;&lt;img style="position:absolute" alt="" width="0px" height="0px" src="http://c.live.com/c.gif?NC=31263&amp;amp;NA=1149&amp;amp;PI=73329&amp;amp;RF=&amp;amp;DI=3919&amp;amp;PS=85545&amp;amp;TP=lucasontivero.spaces.live.com&amp;amp;GT1=lucasontivero"&gt;</description><comments>http://lucasontivero.spaces.live.com/Blog/cns!375AE0CCD1AF61CE!440.entry#comment</comments><guid isPermaLink="true">http://lucasontivero.spaces.live.com/Blog/cns!375AE0CCD1AF61CE!440.entry</guid><pubDate>Thu, 06 Sep 2007 14:40:00 GMT</pubDate><slash:comments>0</slash:comments><msn:type>blogentry</msn:type><live:type>blogentry</live:type><live:typelabel>Blog entry</live:typelabel><wfw:commentRss>http://lucasontivero.spaces.live.com/blog/cns!375AE0CCD1AF61CE!440/comments/feed.rss</wfw:commentRss><wfw:comment>http://lucasontivero.spaces.live.com/Blog/cns!375AE0CCD1AF61CE!440.entry#comment</wfw:comment><dcterms:modified>2007-09-06T15:55:09Z</dcterms:modified></item><item><title>Scripts en c#</title><link>http://lucasontivero.spaces.live.com/Blog/cns!375AE0CCD1AF61CE!261.entry</link><description>&lt;div&gt;Despues de trabajar mucho tiempo con scripting y pasar a .NET, he llegado a extrañar esos pequeños bloquecitos de código, sobre todo a la hora de automatizar pequeñas tareas para las cuales ni siquiera te dan ganas de abrir un Visual Studio. Por ejemplo, hoy queria computar un hash (3 lineas de código) y realmente me dió tanta pero tanta fiaca hacer una solucion en VS y dije &amp;quot;Si pudiera usar el framework de .NET desde un script que feliz que seria&amp;quot; así que buscando y buscando encontré &amp;quot;&lt;a href="http://www.csscript.net/"&gt;Scripts en c#!!!&lt;/a&gt;&amp;quot;. Casi me largo a llorar, es que los scripts son muy grosos cuando:&lt;/div&gt;
&lt;ul&gt;
&lt;li&gt;vamos a cambiar el código con mucha frecuencia.
&lt;li&gt;el código es muy chico y puntual
&lt;li&gt;no nos interesa protegerlo
&lt;li&gt;son ideales para tareas de administración
&lt;li&gt;cuando no tenemos vs
&lt;li&gt;cuando no nos interesa proteger el código
&lt;li&gt;y deben existir 500.00 razones&lt;/ul&gt;
&lt;div&gt;Por otra parte, que raro que Microsoft no brinde la posibilidad de programar los WSH con c# o vb.net, no les parece? &lt;br&gt;Bueno, además de tener &amp;quot;todo&amp;quot; el framework a nuestra disposición hace que sea muy superior a los .vbs o .wsc porque por ejempo podemos trabajar con ws, crear formularios, acceder a db con ado.net, etc. En sintesis, hacemos de todo.&lt;br&gt;Una alegria mas a mi vida. Gracias.&lt;/div&gt;&lt;img src="http://c.services.spaces.live.com/CollectionWebService/c.gif?cid=3988747590285877710&amp;page=RSS%3a+Scripts+en+c%23&amp;referrer=" width="1px" height="1px" border="0" alt=""&gt;&lt;img style="position:absolute" alt="" width="0px" height="0px" src="http://c.live.com/c.gif?NC=31263&amp;amp;NA=1149&amp;amp;PI=73329&amp;amp;RF=&amp;amp;DI=3919&amp;amp;PS=85545&amp;amp;TP=lucasontivero.spaces.live.com&amp;amp;GT1=lucasontivero"&gt;</description><comments>http://lucasontivero.spaces.live.com/Blog/cns!375AE0CCD1AF61CE!261.entry#comment</comments><guid isPermaLink="true">http://lucasontivero.spaces.live.com/Blog/cns!375AE0CCD1AF61CE!261.entry</guid><pubDate>Wed, 21 Mar 2007 13:33:13 GMT</pubDate><slash:comments>0</slash:comments><msn:type>blogentry</msn:type><live:type>blogentry</live:type><live:typelabel>Blog entry</live:typelabel><wfw:commentRss>http://lucasontivero.spaces.live.com/blog/cns!375AE0CCD1AF61CE!261/comments/feed.rss</wfw:commentRss><wfw:comment>http://lucasontivero.spaces.live.com/Blog/cns!375AE0CCD1AF61CE!261.entry#comment</wfw:comment><dcterms:modified>2007-03-21T13:33:13Z</dcterms:modified></item><item><title>Un resumen de ObjectBuilder Framework</title><link>http://lucasontivero.spaces.live.com/Blog/cns!375AE0CCD1AF61CE!201.entry</link><description>&lt;p&gt; &lt;p&gt;Con este post pretendo comenzar un recorrido rápidos (que probablemente después continue) por uno de los assembies creado por el grupo de Patterns &amp;amp; Practices de Microsoft que mas me ha sorprendido. Se trata del ObjectBuilder.dll el cual forma parte del core de la Enterprise Library, del Composite UI Application Block (CAB) y del Mobile Client Software Factory y probablemente de cuanto futuro Application Block libere P&amp;amp;P.  &lt;p&gt;Este assembly es el encargado de realizar la creación de objectos y la inyección de dependecias (DI).  &lt;p&gt;Podríamos ver al ObjectBuilder (extremadamente simplificado) como una lista de acciones (&amp;quot;estrategias&amp;quot;) que permiten ejecutar una variada gama de operaciones sobre los objetos cuando estos son creados. Estas acciones son las que: &lt;ul&gt; &lt;li&gt;Aseguran la creación de instancias de clases concretas cuando se especifica un tipo abstracto.  &lt;li&gt;Aseguran el retorno de instancias existentes cuando son del tipo adecuado o crea una instancia nueva si así se especifica.  &lt;li&gt;Aseguran la ejecución del constructor adecuado. Puesto que al crear una instancia de clase, se selecciona de manera inteligente el constructor que debe invocar aún cuando existan mas de uno. Si el constructor recibe parámetros, los resuelve y se los pasa.  &lt;li&gt;Aseguran la asignación de valores apropiados a las propiedades públicas que contienen atributos específicos y ejecuta métodos automáticamente.  &lt;li&gt;Aseguran la notifica a todo objeto que implemente la interface IBuilderAware cuando una estratégia es ejecutada sobre el objeto.  &lt;li&gt;Además, provee la posibilidad de deshacer las acciones llevadas a cabo sobre un objeto ejecutando el método TearDown sobre la cadena de responsabilidades invertida. &lt;/ul&gt; &lt;p&gt;En otras palabras, ObjectBuilder simplicica la creación e inicialización de objetos. Y nos facilita la vida permitiéndonos tener servicios como clases desacopladas y despreocupándonos de los detalles de creación e inicialización de instancias.  &lt;p&gt;Las clases más significativas de objectBuilder son a mi entender las siguientes: &lt;ul&gt; &lt;li&gt;Estrategias que derivan de BuilderStrategy  &lt;ul&gt; &lt;li&gt;CreationStrategy: Crea un objeto de un tipo dado y lo registra en en locator (Si ya estaba creado también lo registra). Si no encuentra una politica de como se debe crear el objeto entonces simplemente obtiene por reflection el primer constructor y resuelve los parámetros que debe recibir para luego &amp;quot;invocar&amp;quot; al constructor como si fuera un método pasándole estos parámetros. ¿Hace magia o no hace magia?,.... Increible.&lt;br&gt;Ahora, si encuentra una política para construir el objeto (una ConstructorPolicy la cual almacena los tipos de datos de los parámetros que recibe el constructor) puede obtener el constructor adecuado para inicializar el objeto creado. La política fue creada en su momento por la estrategia ConstructorReflectionStrategy la cual, como su nombre lo sugiere, recorre mediante reflection la clase en busca de atributos customs  &lt;li&gt;SingletonStrategy: Busca por una política (ISingletonPolicy) relacionada al objeto tratado en el locator y si existe retorna la instancia.  &lt;li&gt;PropertySetterStrategy: Busca la instancia adecuada para establecer una propiedad pública en el objeto creado.  &lt;li&gt;MethodExecutionStrategy: Ejecuta un método en un objeto resolviendo y pasándole los parámetros adecuados.  &lt;li&gt;BuilderAwareStrategy: Asiva (ejecutando un método obviamente) a los objetos cuando se ha aplicado una estratégia sobre ellos. Todos los objetos interesados en realizar acciones al final de la ejecución de una estrategia deben implementar la interface IBuilderAware.&lt;/ul&gt;&lt;/ul&gt; &lt;blockquote&gt; &lt;p&gt;Las demás estrategias son las encargadas de completar las politicas sobre los objetos mediante reflection y se ejecutan en el estado de PreCreation.&lt;/blockquote&gt; &lt;ul&gt; &lt;ul&gt; &lt;li&gt;PropertyReflectionStrategy  &lt;li&gt;MethodReflectionStrategy  &lt;li&gt;ConstructorReflectionStrategy &lt;/ul&gt;&lt;/ul&gt; &lt;p&gt;  &lt;ul&gt; &lt;li&gt;Builder:&lt;br&gt;Esta clase contiene una lista de políticas y  una lista de estratégias genéricas de un estado en particular.&lt;br&gt;Estos pueden &amp;quot;estados&amp;quot; ser: PreCreation, Creation, Initialization, PostInitialization&lt;br&gt;Cada lista de estrategias es para un &amp;quot;estado&amp;quot; de los mencionados y contiene &amp;quot;IBuilderStrategy (s)&amp;quot; aplicables a esos estados. &lt;/ul&gt; &lt;p&gt;  &lt;ul&gt; &lt;li&gt;StrategyList:&lt;br&gt;Posee un diccionario con tantas entradas como &amp;quot;estados&amp;quot; haya resgistrados (es decir, 4) como key y como value una lista de estrategias (List&amp;lt;IBuilderStrategy&amp;gt;). &lt;/ul&gt; &lt;blockquote&gt; &lt;p&gt;La definición de estos es:  Dictionary&amp;lt;TStageEnum, List&amp;lt;IBuilderStrategy&amp;gt;&amp;gt; stages;&lt;/blockquote&gt; &lt;blockquote&gt; &lt;p&gt;Uno de los métodos mas importantes de la clase StrategyList es MakeStrategyChain el cual crea y devuelve un objeto IBuilderStrategyChain que contiene una lista con todas las estrategias de todos los estados. Esta lista es la llamada cadena de responsabilidades que se iterará invocanco a los métods DoBuildUp de cada estrategias contenida en la lista. &lt;p&gt;El otro método importante es MakeReverseStrategyChain el cual retorna la misma cadena pero ordenada de manera inversa y la iterará la clase Builder invocando al método TearDown de cada estrategia contenida es esta cadena para deshacer la acción realizada por estas.&lt;/blockquote&gt; &lt;ul&gt; &lt;li&gt;IBuilderStrategy:&lt;br&gt;Esta es la interface que deben implementar las estratégias. Exige 2 métodos:  &lt;ul&gt; &lt;li&gt;object BuildUp(IBuilderContext context, Type typeToBuild, object existing, string idToBuild)&lt;br&gt;El cual es llamado durante la ejecución de la cadena de responsabilidades para realizar la acción propia de la estrategia.  &lt;li&gt;object TearDown(IBuilderContext context, object item)&lt;br&gt;El cual es llamado durante la ejecución de la cadena de responsabilidades para deshacer la acción propia de la estrategia.&lt;br&gt;&lt;/ul&gt; &lt;li&gt;BuilderContext&lt;br&gt;Esta clase contiene:&lt;br&gt;La cadena de responsabilidades (IBuilderStrategyChain)&lt;br&gt;Las políticas (PolicyList) y&lt;br&gt;El Localizador (IReadWriteLocator)&lt;/ul&gt; &lt;p&gt;  &lt;ul&gt; &lt;li&gt;Locator:&lt;br&gt;Esta clase no es mas que un diccionario que contiene como key el tipo de dato y como valor una instacia de ese tipo. Algo así como un pool de objetos sobre los cuales se aplicarán las estrategias. Este diccionario se mantiene con WeakReferences para que cualquier objeto almacenado pueda ser recogido por el GC.&lt;/ul&gt;&lt;img src="http://c.services.spaces.live.com/CollectionWebService/c.gif?cid=3988747590285877710&amp;page=RSS%3a+Un+resumen+de+ObjectBuilder+Framework&amp;referrer=" width="1px" height="1px" border="0" alt=""&gt;&lt;img style="position:absolute" alt="" width="0px" height="0px" src="http://c.live.com/c.gif?NC=31263&amp;amp;NA=1149&amp;amp;PI=73329&amp;amp;RF=&amp;amp;DI=3919&amp;amp;PS=85545&amp;amp;TP=lucasontivero.spaces.live.com&amp;amp;GT1=lucasontivero"&gt;</description><comments>http://lucasontivero.spaces.live.com/Blog/cns!375AE0CCD1AF61CE!201.entry#comment</comments><guid isPermaLink="true">http://lucasontivero.spaces.live.com/Blog/cns!375AE0CCD1AF61CE!201.entry</guid><pubDate>Wed, 01 Nov 2006 03:13:16 GMT</pubDate><slash:comments>0</slash:comments><msn:type>blogentry</msn:type><live:type>blogentry</live:type><live:typelabel>Blog entry</live:typelabel><wfw:commentRss>http://lucasontivero.spaces.live.com/blog/cns!375AE0CCD1AF61CE!201/comments/feed.rss</wfw:commentRss><wfw:comment>http://lucasontivero.spaces.live.com/Blog/cns!375AE0CCD1AF61CE!201.entry#comment</wfw:comment><dcterms:modified>2006-11-01T03:13:16Z</dcterms:modified></item><item><title>Resurrection - Permitiendo lo prohibido</title><link>http://lucasontivero.spaces.live.com/Blog/cns!375AE0CCD1AF61CE!188.entry</link><description>&lt;div&gt;
&lt;p&gt;Curiosiando un poco por algunas publicaciones de microsoft en la web me topé con el concepto de &amp;quot;Resurrection&amp;quot;. Este, que parece un buen nombre candidato para la próxima Matriz, no es en realidad otra cosa que una consecuencia, a mi entender poco deseable (Uds. pueden pensar lo contrario), del algoritmo de recolección de basura del  CLR. 
&lt;p&gt;Se dice que un objeto ha resucitado cuando luego de que el GC lo ha identificado como basura y ha ejecutado el destructor, el objeto sigue vivo y no es eliminado de la memoria. Esta situación se presenta en el siguiente código:&lt;pre&gt;    class Program
    {
        static public ClassA refToObjectA;
        static void Main(string[] args)
        {
            refToObjectA = new ClassA();
            refToObjectA = null;
            GC.Collect();
            GC.WaitForPendingFinalizers();
            Console.WriteLine(refToObjectA.refToObjectB.val);
            refToObjectA = null;
            GC.Collect();
            GC.WaitForPendingFinalizers();
        }
    }

    public class ClassA
    {
        public ClassB refToObjectB;
        public ClassA()
        {
            refToObjectB = new ClassB();
        }

        ~ClassA()
        {
            Console.WriteLine(&amp;quot;Bye A!&amp;quot;);
            Program.refToObjectA = this;
        }
    }

    public class ClassB
    {
        public String val;
        public ClassB()
        {
            val = &amp;quot;Hola&amp;quot;;
        }

        ~ClassB()
        {
            Console.WriteLine(&amp;quot;Bye B!&amp;quot;);
            val = &amp;quot;Chau&amp;quot;;
        }
    }
&lt;/pre&gt;
&lt;p&gt;Como en este caso el destructor de la ClassA tiene la linea:&lt;br&gt;Program.refToObjectA = this;&lt;br&gt;se tiene una referencia al objeto que se estaba por recolectar y por lo tanto, el GC no debe eliminarlo. El problema es que como este objeto ya se habia seleccionado para colectarlo, y se quitó de la cola de finalización (una estructura que mantiene la lista de todos los objetos cuyos destructures deben invocarse), la proxima vez que el GC lo deba recoger ya no volverá a ejecutarse el destructor.
&lt;p&gt;En el ejemplito de arriba no habría problemas pero estos pueden presentarse en casos que se manejen recursos como conexiones a DBs, Archivos u otros que pueden ser liberados en el destructor y luego, una vez resucitado el objeto, intentar accederlos.
&lt;p&gt;Para solucionar este problema (que no se vuelve a ejecutar el destructor) existe el método GC.ReRegisterForFinalize el cual le dice al GC que cree una nueva entrada en la cola de finalización para el objeto que se le indique por parámetro pero a mi entender soluciona un inconveniente a la vez que posibilita la aparición de otro que ocurre cuando este se invoca mas de una vez por cada resurrección o bien se lo invoca cuando no existen resurrecciones. En este caso el destructor del objeto indicado se ejecutará tantas veces como invocaciones al método GC.ReRegisterForFinalize se hayan realizado.&lt;/div&gt;&lt;img src="http://c.services.spaces.live.com/CollectionWebService/c.gif?cid=3988747590285877710&amp;page=RSS%3a+Resurrection+-+Permitiendo+lo+prohibido&amp;referrer=" width="1px" height="1px" border="0" alt=""&gt;&lt;img style="position:absolute" alt="" width="0px" height="0px" src="http://c.live.com/c.gif?NC=31263&amp;amp;NA=1149&amp;amp;PI=73329&amp;amp;RF=&amp;amp;DI=3919&amp;amp;PS=85545&amp;amp;TP=lucasontivero.spaces.live.com&amp;amp;GT1=lucasontivero"&gt;</description><comments>http://lucasontivero.spaces.live.com/Blog/cns!375AE0CCD1AF61CE!188.entry#comment</comments><guid isPermaLink="true">http://lucasontivero.spaces.live.com/Blog/cns!375AE0CCD1AF61CE!188.entry</guid><pubDate>Fri, 22 Sep 2006 05:48:02 GMT</pubDate><slash:comments>0</slash:comments><msn:type>blogentry</msn:type><live:type>blogentry</live:type><live:typelabel>Blog entry</live:typelabel><wfw:commentRss>http://lucasontivero.spaces.live.com/blog/cns!375AE0CCD1AF61CE!188/comments/feed.rss</wfw:commentRss><wfw:comment>http://lucasontivero.spaces.live.com/Blog/cns!375AE0CCD1AF61CE!188.entry#comment</wfw:comment><dcterms:modified>2006-10-05T18:52:09Z</dcterms:modified></item></channel></rss>