<?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/"
	>

<channel>
	<title>Espacio de Dario Quintana &#187; C#</title>
	<atom:link href="http://blog.darioquintana.com.ar/category/net/c/feed/" rel="self" type="application/rss+xml" />
	<link>http://blog.darioquintana.com.ar</link>
	<description></description>
	<lastBuildDate>Tue, 21 Jun 2011 22:51:18 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.2</generator>
		<item>
		<title>C# 4.0: Meet the Design Team</title>
		<link>http://blog.darioquintana.com.ar/2008/07/21/c-40-meet-the-design-team/</link>
		<comments>http://blog.darioquintana.com.ar/2008/07/21/c-40-meet-the-design-team/#comments</comments>
		<pubDate>Mon, 21 Jul 2008 21:58:01 +0000</pubDate>
		<dc:creator>Dario Quintana</dc:creator>
				<category><![CDATA[C#]]></category>
		<category><![CDATA[video]]></category>

		<guid isPermaLink="false">http://blog.darioquintana.com.ar/2008/07/21/c-40-meet-the-design-team/</guid>
		<description><![CDATA[</p> <p>Hace unos días había dejado el enlace en las lista de C# del MUG (Argentina), y para que no digan que en este blog solo posteo código, hoy les dejo un videito para que se entretengan un rato. Por cierto, sería muy interesante saber cuales serían las nuevas features de C# 4.0, habrá que [...]]]></description>
			<content:encoded><![CDATA[</p>
<p>Hace unos días había dejado el enlace en las lista de C# del MUG (Argentina), y para que no digan que en este blog solo posteo código, hoy les dejo un videito para que se entretengan un rato. Por cierto, sería muy interesante saber cuales serían las nuevas features de C# 4.0, habrá que esperar.</p>
<p><iframe src="http://channel9.msdn.com/posts/Charles/409364/player/" frameborder="0" width="320" scrolling="no" height="325"></iframe><br /><a href="http://channel9.msdn.com/posts/Charles/C-40-Meet-the-Design-Team/">C# 4.0: Meet the Design Team</a></p>
]]></content:encoded>
			<wfw:commentRss>http://blog.darioquintana.com.ar/2008/07/21/c-40-meet-the-design-team/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Sharpen &#8211; Conversi&#243;n inteligente desde Java a C#</title>
		<link>http://blog.darioquintana.com.ar/2008/05/20/sharpen-conversin-inteligente-desde-java-a-c/</link>
		<comments>http://blog.darioquintana.com.ar/2008/05/20/sharpen-conversin-inteligente-desde-java-a-c/#comments</comments>
		<pubDate>Tue, 20 May 2008 21:04:06 +0000</pubDate>
		<dc:creator>Dario Quintana</dc:creator>
				<category><![CDATA[C#]]></category>
		<category><![CDATA[Java]]></category>

		<guid isPermaLink="false">http://blog.darioquintana.com.ar/2008/05/20/sharpen-conversin-inteligente-desde-java-a-c/</guid>
		<description><![CDATA[<p>Este release lo estaba esperando desde hace mucho tiempo por parte de <a href="http://www.db4o.com">Db4o</a>, y los que siguen a Db4o de cerca creo que también. </p> <p>Para los que no están familiarizados, Db4o corre sus aplicaciones en ambas plataformas: Java y .Net. El mayor trabajo se realiza en Java, que luego mediante Sharpen se realiza [...]]]></description>
			<content:encoded><![CDATA[<p>Este release lo estaba esperando desde hace mucho tiempo por parte de <a href="http://www.db4o.com">Db4o</a>, y los que siguen a Db4o de cerca creo que también. </p>
<p>Para los que no están familiarizados, Db4o corre sus aplicaciones en ambas plataformas: Java y .Net. El mayor trabajo se realiza en Java, que luego mediante Sharpen se realiza la conversión hacia C#, si bien no el 100% de Db4o.Net está generado, la mayoría lo está.</p>
<ul>
<li>
<p><a href="http://developer.db4o.com/Resources/view.aspx/Reference/Sharpen/How_To_Setup_Sharpen">How To Setup Sharpen</a></p>
<li>
<p><a href="http://developer.db4o.com/Resources/view.aspx/Reference/Sharpen/Example_Conversion">Example Conversion</a></p>
<li>
<p><a href="http://developer.db4o.com/Resources/view.aspx/Reference/Sharpen/Sharpen_Command-Line_Arguments">Sharpen Command-Line Arguments</a></p>
<li>
<p><a href="http://developer.db4o.com/Resources/view.aspx/Reference/Sharpen/Sharpen_Annotations">Sharpen Annotations</a></p>
</li>
</ul>
<p>Espero que sirva !</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.darioquintana.com.ar/2008/05/20/sharpen-conversin-inteligente-desde-java-a-c/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Mono.Sms preview</title>
		<link>http://blog.darioquintana.com.ar/2007/06/23/monosms-preview/</link>
		<comments>http://blog.darioquintana.com.ar/2007/06/23/monosms-preview/#comments</comments>
		<pubDate>Sat, 23 Jun 2007 04:07:03 +0000</pubDate>
		<dc:creator>Dario Quintana</dc:creator>
				<category><![CDATA[.NET]]></category>
		<category><![CDATA[C#]]></category>
		<category><![CDATA[Mono]]></category>
		<category><![CDATA[monosms]]></category>
		<category><![CDATA[NAnt]]></category>

		<guid isPermaLink="false">http://blog.darioquintana.com.ar/2007/06/23/monosms-preview/</guid>
		<description><![CDATA[<p>Ya está para descargar Mono.Sms, hosteado&#160;como&#160;proyecto en&#160;<a href="http://code.google.com/p/monosms">Code Google</a>.</p> <p> </p> <p>Los binarios&#160;han sido probados en Mono 1.2.4/.Net Framework 2.0</p> <p>Este es el trunk, pueden descargar el código fuente con un cliente de SVN como <a href="http://tortoisesvn.tigris.org/">Tortoise SVN</a>si usan Windows.</p> <a title="http://monosms.googlecode.com/svn/trunk/" href="http://monosms.googlecode.com/svn/trunk/">http://monosms.googlecode.com/svn/trunk/</a> <p>Aquí están los binarios/setup para descargar:</p> <a title="http://code.google.com/p/monosms/downloads/list" href="http://code.google.com/p/monosms/downloads/list">http://code.google.com/p/monosms/downloads/list</a> <p>&#160;Para dejar comentarios [...]]]></description>
			<content:encoded><![CDATA[<p>Ya está para descargar Mono.Sms, hosteado&nbsp;como&nbsp;proyecto en&nbsp;<a href="http://code.google.com/p/monosms">Code Google</a>.</p>
<p><img src="http://uooopaa.googlepages.com/monosms-preview3.png"> </p>
<p>Los binarios&nbsp;han sido probados en Mono 1.2.4/.Net Framework 2.0</p>
<p>Este es el trunk, pueden descargar el<strong> <u>código fuente</u></strong> con un cliente de SVN como <a href="http://tortoisesvn.tigris.org/">Tortoise SVN</a>si usan Windows.</p>
<ul>
<li><a title="http://monosms.googlecode.com/svn/trunk/" href="http://monosms.googlecode.com/svn/trunk/">http://monosms.googlecode.com/svn/trunk/</a></li>
</ul>
<p>Aquí están los <strong><u>binarios/setup</u></strong> para descargar:</p>
<ul>
<li><a title="http://code.google.com/p/monosms/downloads/list" href="http://code.google.com/p/monosms/downloads/list">http://code.google.com/p/monosms/downloads/list</a></li>
</ul>
<p>&nbsp;Para dejar <strong><u>comentarios</u></strong> creé este grupo en google:</p>
<ul>
<li><a title="http://groups.google.com.ar/group/monosms/" href="http://groups.google.com.ar/group/monosms/">http://groups.google.com.ar/group/monosms/</a></li>
</ul>
<p>Voluntarios, envien los <u>parches</u>, reporte de<u> issues/bugs</u> aquí:</p>
<ul>
<li><a title="http://code.google.com/p/monosms/issues/list" href="http://code.google.com/p/monosms/issues/list">http://code.google.com/p/monosms/issues/list</a></li>
</ul>
<p>&nbsp;El código fuente se puede compilar usando <a href="http://nant.sourceforge.net/">NAnt</a>. He incluido el archivo <em>default.build</em> en el SVN para este fin.</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.darioquintana.com.ar/2007/06/23/monosms-preview/feed/</wfw:commentRss>
		<slash:comments>5</slash:comments>
		</item>
		<item>
		<title>Iteraciones en C# &#8211; capturas de pantalla</title>
		<link>http://blog.darioquintana.com.ar/2007/05/08/iteraciones-en-c-capturas-de-pantalla/</link>
		<comments>http://blog.darioquintana.com.ar/2007/05/08/iteraciones-en-c-capturas-de-pantalla/#comments</comments>
		<pubDate>Tue, 08 May 2007 05:10:33 +0000</pubDate>
		<dc:creator>Dario Quintana</dc:creator>
				<category><![CDATA[.NET]]></category>
		<category><![CDATA[C#]]></category>
		<category><![CDATA[Linux]]></category>
		<category><![CDATA[Mono]]></category>

		<guid isPermaLink="false">http://blog.darioquintana.com.ar/2007/05/08/iteraciones-en-c-capturas-de-pantalla/</guid>
		<description><![CDATA[<p>En este <a href="http://blog.darioquintana.com.ar/2007/05/07/iteraciones-en-c/">post previo</a>, hablábamos sobre las iteraciones en C# y donde dije que Mono me resultó un poco más rápido en Linux a diferencia con Mono en Windows y .Net Framework de MS. Bueno aquí les muestro las resultados de las ultimas corridas de cada uno para que vean. La clase con la [...]]]></description>
			<content:encoded><![CDATA[<p>En este <a href="http://blog.darioquintana.com.ar/2007/05/07/iteraciones-en-c/">post previo</a>, hablábamos sobre las iteraciones en C# y donde dije que Mono me resultó <strong>un poco</strong> más rápido en Linux a diferencia con Mono en Windows y .Net Framework de MS. Bueno aquí les muestro las resultados de las ultimas corridas de cada uno para que vean. La clase con la que probé se encuentra aquí: <a href="http://uooopaa.googlepages.com/Iteraciones.zip">Iteraciones.zip</a></p>
<p><u><strong>Con .Net Framework de MS:</strong></u><img alt="con MS .Net Framework" src="http://uooopaa.googlepages.com/iteraciones_dotnet_windows.jpg"> </p>
<p>&nbsp;</p>
<p><u><strong>Con Mono en Windows:</strong></u><img alt="con Mono en Windows" src="http://uooopaa.googlepages.com/iteraciones_mono_windows.jpg"> </p>
<p><u><strong>Con Mono en Linux:</strong></u><img alt="con Mono en Linux" src="http://uooopaa.googlepages.com/iteraciones_mono_linux.jpg"></p>
]]></content:encoded>
			<wfw:commentRss>http://blog.darioquintana.com.ar/2007/05/08/iteraciones-en-c-capturas-de-pantalla/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Iteraciones en C#</title>
		<link>http://blog.darioquintana.com.ar/2007/05/07/iteraciones-en-c/</link>
		<comments>http://blog.darioquintana.com.ar/2007/05/07/iteraciones-en-c/#comments</comments>
		<pubDate>Mon, 07 May 2007 19:29:02 +0000</pubDate>
		<dc:creator>Dario Quintana</dc:creator>
				<category><![CDATA[C#]]></category>

		<guid isPermaLink="false">http://blog.darioquintana.com.ar/2007/05/07/iteraciones-en-c/</guid>
		<description><![CDATA[<p>A pedido del público, voy a hacer este post donde mostramos las formas de Iterar en C#. Estuve mirando que tengo muchos accesos al blog con estas palabras: Iteraciones en C#, entonces, hablemos de ello.</p> <p>Carga de una lista:</p> List&#60;string&#62; list = new List&#60;string&#62;(); list.Add("Visual Basic Dynamic"); list.Add("IronPython"); list.Add("Ruby"); list.Add("Javascript"); <p>Iteremos !</p> <p>1.&#160;Utilizando foreach:</p> foreach(string [...]]]></description>
			<content:encoded><![CDATA[<p>A pedido del público, voy a hacer este post donde mostramos las formas de Iterar en C#. Estuve mirando que tengo muchos accesos al blog con estas palabras: Iteraciones en C#, entonces, hablemos de ello.</p>
<p>Carga de una lista:</p>
<pre class="csharpcode">List&lt;<span class="kwrd">string</span>&gt; list = <span class="kwrd">new</span> List&lt;<span class="kwrd">string</span>&gt;();

list.Add(<span class="str">"Visual Basic Dynamic"</span>);
list.Add(<span class="str">"IronPython"</span>);
list.Add(<span class="str">"Ruby"</span>);
list.Add(<span class="str">"Javascript"</span>);</pre>
<p>Iteremos !</p>
<p>1.&nbsp;Utilizando <strong>foreach</strong>:</p>
<pre class="csharpcode"><span class="kwrd">foreach</span>(<span class="kwrd">string</span> item <span class="kwrd">in</span> list)
{
    Console.WriteLine(item);
}</pre>
<p>2. Utilizando <strong>IEnumerator</strong>:</p>
<pre class="csharpcode">IEnumerator&lt;<span class="kwrd">string</span>&gt; ie = list.GetEnumerator();

<span class="kwrd">while</span>(ie.MoveNext())
{
    Console.WriteLine(ie.Current);
}</pre>
<p>&nbsp;3. Utilizando <strong>for</strong>:</p>
<pre class="csharpcode"><span class="kwrd">for</span>(<span class="kwrd">int</span> i = 0; i &lt; list.Count; i++)
{
    Console.WriteLine(list[i]);
}</pre>
<p>&nbsp;4. Usando metodo <strong>.ForEach(System.Action&lt;T&gt;)</strong>:</p>
<pre class="csharpcode" style="width: 548px; height: 20px">list.ForEach( <span class="kwrd">delegate</span>(<span class="kwrd">string</span> str)  { Console.WriteLine(str); } );</pre>
<p>&nbsp;5. Metodo 4, pero sacando ventaja de la inferencia de tipos:</p>
<pre class="csharpcode">list.ForEach(Console.WriteLine);</pre>
<p><strong>¿Cuál es más rapido?</strong> No me atrevo a decir que método es más rapido, he hecho una clase de prueba <a href="http://uooopaa.googlepages.com/Iteraciones.zip">[Iteraciones.cs]</a>, con 10000 iteraciones (nunca tengo tanto para iterar), y llegué a resultados similares.</p>
<p>Con Mono en Linux, he notado <strong>un poco</strong> más de rapidez que con Mono en Windows, inclusive más rapidez que&nbsp;con .Net de Microsoft. En Windows y Linux (Ubuntu 7.04) he usado Mono 1.2.3.1 version. </p>
<p>Caracteristicas de la laptop: Procesador Intel Core 2 Duo T5600 1.83GHz, 512Mb DDR2-667.</p>
<p>Considero que todas las formas son claras, son estructuras bien conocidas y cualquiera de ellas&nbsp;resulta facil de leer.&nbsp;Hay que usar la que más convenga llegado el caso. Por ejemplo:</p>
<p>1. <strong>for</strong>&nbsp;es más útil cuando conocemos los limites de la iteración, y también si queremos en todo momento consultar por qué número de iteración vamos.</p>
<p>2. <strong>foreach</strong> es para ir tratanto cada ítem dentro de su estructura. No es muy útil si se tiene que hacer castings por cada ítem.</p>
<p>3. <strong>IEnumerator</strong>, es para aplicar el patron iterator sin ninguna duda. Y así ir iterando al siguiente item.</p>
<p>4. <strong>ForEach</strong>, sin duda la ventaja de este este método es la única linea que se necesita. Se trata de una estructura que recibe como parámetro un delegado Action&lt;T&gt;, y dentro de sí, existe una iteración. Mono realiza esta iteración usando un foreach, y el .net framework de ms usa un for. Cuestion de gustos quizas.&nbsp;</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.darioquintana.com.ar/2007/05/07/iteraciones-en-c/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Los m&#233;todos extendidos clarifican el c&#243;digo</title>
		<link>http://blog.darioquintana.com.ar/2007/04/01/los-mtodos-extendidos-clarifican-el-cdigo/</link>
		<comments>http://blog.darioquintana.com.ar/2007/04/01/los-mtodos-extendidos-clarifican-el-cdigo/#comments</comments>
		<pubDate>Sun, 01 Apr 2007 12:27:56 +0000</pubDate>
		<dc:creator>Dario Quintana</dc:creator>
				<category><![CDATA[.NET]]></category>
		<category><![CDATA[C#]]></category>

		<guid isPermaLink="false">http://blog.darioquintana.com.ar/2007/04/01/los-mtodos-extendidos-clarifican-el-cdigo/</guid>
		<description><![CDATA[<p>Estuve jugando con los Métodos Extendidos en C# 3.0, y la verdad que esta feature hace que el código sea más legible.</p> string[] terminos = new string[] { "gurí", "guaina", "tereré", "mate" }; foreach (var item in terminos) Console.WriteLine(item); <p>Utilizando estas extensiones de métodos:</p> <p></p> public delegate void VoidsHandler&#60;T&#62;(T param); public static class DarioExtend { [...]]]></description>
			<content:encoded><![CDATA[<p>Estuve jugando con los Métodos Extendidos en C# 3.0, y la verdad que esta feature hace que el código sea más legible.</p>
<pre class="csharpcode">
<span class="kwrd">string</span>[] terminos = <span class="kwrd">new</span> <span class="kwrd">string</span>[] { <span class="str">"gurí"</span>, <span class="str">"guaina"</span>, <span class="str">"tereré"</span>, <span class="str">"mate"</span> };

            <span class="kwrd">foreach</span> (var item <span class="kwrd">in</span> terminos)
                Console.WriteLine(item);</pre>
<p>Utilizando estas extensiones de métodos:</p>
<p><!-- code formatted by http://manoli.net/csharpformat/ --></p>
<pre class="csharpcode">
<span class="kwrd">public</span> <span class="kwrd">delegate</span> <span class="kwrd">void</span> VoidsHandler&lt;T&gt;(T param);

    <span class="kwrd">public</span> <span class="kwrd">static</span> <span class="kwrd">class</span> DarioExtend
    {
        <span class="kwrd">public</span> <span class="kwrd">static</span> <span class="kwrd">void</span> ApplyToAll&lt;T&gt;(<span class="kwrd">this</span> IList&lt;T&gt; lista, VoidsHandler&lt;T&gt; handler)
        {
            <span class="kwrd">foreach</span> (var item <span class="kwrd">in</span> lista)
            {
                handler(item);
            }
        }

        <span class="kwrd">public</span> <span class="kwrd">static</span> <span class="kwrd">void</span> WriteLine&lt;T&gt;(<span class="kwrd">this</span> IList&lt;T&gt; lista)
        {
            <span class="kwrd">foreach</span> (var item <span class="kwrd">in</span> lista)
            {
                Console.WriteLine(item);
            }

        }
    }</pre>
<p>La forma de imprimir podría cambiarse por:</p>
<pre class="csharpcode">terminos.ApplyToAll(item =&gt; Console.WriteLine(item));</pre>
<p>ó por esto:
<pre class="csharpcode"> terminos.WriteLine();</pre>
]]></content:encoded>
			<wfw:commentRss>http://blog.darioquintana.com.ar/2007/04/01/los-mtodos-extendidos-clarifican-el-cdigo/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Inyecci&#243;n de Dependencia con Spring.Net</title>
		<link>http://blog.darioquintana.com.ar/2006/12/28/inyeccin-de-dependencia-con-springnet/</link>
		<comments>http://blog.darioquintana.com.ar/2006/12/28/inyeccin-de-dependencia-con-springnet/#comments</comments>
		<pubDate>Thu, 28 Dec 2006 00:54:04 +0000</pubDate>
		<dc:creator>Dario Quintana</dc:creator>
				<category><![CDATA[.NET]]></category>
		<category><![CDATA[C#]]></category>
		<category><![CDATA[IoC]]></category>
		<category><![CDATA[patrones]]></category>

		<guid isPermaLink="false">http://blog.darioquintana.com.ar/?p=46</guid>
		<description><![CDATA[<p><a href="http://www.springframework.net">Spring.Net</a> es uno de los frameworks más conocidos para implementar <a href="http://www.martinfowler.com/articles/injection.html">Inyección de Dependencia</a> (también conocido como Inversión de Control -IoC). Otros que nos permiten hacer este trabajo son: <a href="http://www.picocontainer.org/">PicoContainer</a>, <a href="http://www.codeplex.com/Wiki/View.aspx?ProjectName=ObjectBuilder">ObjectBuilder</a>, <a href="http://wiki.castleproject.org/index.php/Windsor_Container">Windsor Container</a>.</p> <p>Basicamente, qué queremos lograr? Fácil, crear nuestros objetos, sin importar quién me provea la implementación.</p> <p>En vez de [...]]]></description>
			<content:encoded><![CDATA[<p><a href="http://www.springframework.net">Spring.Net</a> es uno de los frameworks más conocidos para implementar <a href="http://www.martinfowler.com/articles/injection.html">Inyección de Dependencia</a> (también conocido como Inversión de Control -IoC). Otros que nos permiten hacer este trabajo son: <a href="http://www.picocontainer.org/">PicoContainer</a>, <a href="http://www.codeplex.com/Wiki/View.aspx?ProjectName=ObjectBuilder">ObjectBuilder</a>, <a href="http://wiki.castleproject.org/index.php/Windsor_Container">Windsor Container</a>.</p>
<p><strong>Basicamente, <font color="#0000ff">qué queremos lograr?</font> Fácil, <font color="#0000ff">crear nuestros objetos, sin importar quién me provea la implementación.</font></strong></p>
<p>En vez de hacer esto:</p>
<pre><font color="#004080">(1) Cliente</font> obj_cliente = <font color="#0000ff">new</font> <font color="#004080">Cliente</font>();</pre>
<p>Podemos hacer esto:</p>
<pre><font color="#004080">(2) ICliente</font> obj_cliente = (ICliente) AppContext.Instance.GetObject(<font color="#804040">"Cliente"</font>);</pre>
<p>Expliquemos, en (1) le estamos diciendo a obj_cliente quién va a crearlo: <em><font color="#0000ff">new</font> <font color="#004080">Cliente</font>();</em> Es decir, le estamos diciendo quien le va a proveer de la implementación, y nunca vamos a poder cambiar esto, a menos que lo hagamos y volvamos a compilar. En (2) es distinto, estamos pidiendo una implementación, pero no sabemos quien nos la va a dar. Solo sabemos que quién nos proveea la construcción, va a implementar la interfaz <em>ICliente</em>. <em>AppContext</em> es un wrapper que hice para crear un singleton del contexto de toda la aplicación (está en el codigo fuente que se puede descargar más abajo).</p>
<p>El lugar donde le decimos qué clase se va a encargar de la implementación, es en el app.config (en una de las tantas lineas para configurar Spring.Net):</p>
<p><!-- code formatted by http://manoli.net/csharpformat/ --></p>
<pre class="csharpcode">
<span class="kwrd">&lt;</span><span class="html">object</span> <span class="attr">name</span>=?<span class="attr">Cliente</span>? <span class="attr">type</span>=?<span class="attr">Entities</span>.<span class="attr">Cliente</span>, <span class="attr">Entities</span>? <span class="attr">singleton</span>=?<span class="attr">false</span>?<span class="kwrd">/&gt;</span></pre>
<p>En esta línea de código Entities.Cliente es la Clase que nos proveerá la implementación, y Entities es el assembly (que TIENE que estar en la carpeta de salida, donde está el .exe). También podemos ver cuan<strong> fácil es implementar un singleton</strong> de esta manera, solamente escribiendo <em>singleton=&#8221;true&#8221;</em> (ú obviandolo, es el valor por defecto), entonces no tenemos que hacerlo programaticamente.</p>
<p>Para el ejemplo lo que hice es organizar los proyectos de esta forma:</p>
<p><a href="http://darionet.wordpress.com/files/2006/12/windowslivewriterinyeccindedependenciaconspring-f993proyectos-spring7.jpg"><img src="http://darionet.wordpress.com/files/2006/12/windowslivewriterinyeccindedependenciaconspring-f993proyectos-spring-thumb3.jpg" align="left" border="0" height="240" width="134" /></a></p>
<p>Lo que hariamos normalmente es referenciar Entities desde todas las partes del proyecto, en vez de esto, lo haremos con Entities.Contracts que contienen las interfaces, de modo que siempre programaremos contra las interfaces, nunca contra la implementación. Los proyectos no poseen relación de conocimiento con Entities, en ningún momento se lo referencia.</p>
<p>El tip del día: <strong><em><font color="#0000ff">Hay que programar contra las interfaces.</font></em></strong></p>
<p><font color="#0000ff"><a href="http://uooopaa.googlepages.com/ioc.zip">Descargar codigo fuente [Proyecto hecho con SharpDevelop]</a></font></p>
<p><strong>Donde más podemos utilizarlo ?</strong> En la capa de acceso a datos, podríamos persistir los objetos con db4o, y en otra implementación lo podríamos hacer usando NHibernate! Y esto lo lograríamos creando una interfaz IBaseRepository que tenga metodos como Guardar, Eliminar, Buscar y luego crear las implementaciones para cada uno de los providers por ejemplo BaseRepositoryDb4o y BaseRepositoryNH.</p>
<p>Espero que sirva!</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.darioquintana.com.ar/2006/12/28/inyeccin-de-dependencia-con-springnet/feed/</wfw:commentRss>
		<slash:comments>19</slash:comments>
		</item>
		<item>
		<title>using NHibernate.Tool.hbm2ddl</title>
		<link>http://blog.darioquintana.com.ar/2006/11/12/using-nhibernatetoolhbm2ddl/</link>
		<comments>http://blog.darioquintana.com.ar/2006/11/12/using-nhibernatetoolhbm2ddl/#comments</comments>
		<pubDate>Sun, 12 Nov 2006 06:07:38 +0000</pubDate>
		<dc:creator>Dario Quintana</dc:creator>
				<category><![CDATA[C#]]></category>
		<category><![CDATA[codegeneration]]></category>
		<category><![CDATA[NHibernate]]></category>

		<guid isPermaLink="false">http://blog.darioquintana.com.ar/?p=39</guid>
		<description><![CDATA[<p>Una herramienta muy importante de NHibernate, a la vez, deseable por los ORM, es la generación de código.</p> <p>Para generar el DDL de la base de datos, nos podemos valer de la información del esquema, que nos brindan los archivos de mapeo ó mapping files: hbm.xml.</p> <p>Un vez que tenemos bien configurados estos archivos, podemos [...]]]></description>
			<content:encoded><![CDATA[<p>Una herramienta muy importante de NHibernate, a la vez, deseable por los ORM, es la generación de código.</p>
<p>Para generar el DDL de la base de datos, nos podemos valer de la información del esquema, que nos brindan los archivos de mapeo ó mapping files: hbm.xml.</p>
<p>Un vez que tenemos bien configurados estos archivos, podemos generar las tablas con solamente incluir un par de sentencias en .Net y configurar un archivo xml. Tambien se tiene que tener referenciado a NHibernate.</p>
<p>Código en C#:</p>
<pre>using System;
using NHibernate.Cfg;
using  NHibernate.Tool.hbm2ddl;
public class MyClass
{
    public static void Main()
    {
            Configuration config = new Configuration();
            config.Configure();
            SchemaExport exporter = new SchemaExport(config);
            //exporter.SetOutputFile(@"c:testDDL.sql");
            exporter.Drop(true, true);
            exporter.Create(true, true);
    }
}</pre>
<p>Archivo hibernate.cfg.xml (debe ir copiado en el directorio de salida):</p>
<pre>&lt;?xml version="1.0" encoding="utf-8" ?&gt;
&lt;hibernate-configuration  xmlns="urn:nhibernate-configuration-2.0" &gt;
 &lt;session-factory name="NHibernate"&gt;
	&lt;property name="connection.provider"&gt;NHibernate.Connection.DriverConnectionProvider&lt;/property&gt;
	&lt;property name="connection.driver_class"&gt;NHibernate.Driver.FirebirdClientDriver&lt;/property&gt;
	&lt;property name="connection.connection_string"&gt;
	ServerType=1;
	User=sysdba;password=masterkey;Database=C:ruraldata.fdb;
	Pooling=false
	&lt;/property&gt;
	&lt;property name="show_sql"&gt;true&lt;/property&gt;
	&lt;property name="dialect"&gt;NHibernate.Dialect.FirebirdDialect&lt;/property&gt;
	&lt;property name="use_outer_join"&gt;true&lt;/property&gt;
	&lt;property name="query.substitutions"&gt;true 1, false 0, yes 'Y', no 'N'&lt;/property&gt;

	&lt;mapping assembly="RuralSolution.Entities" /&gt;

 &lt;/session-factory&gt;
&lt;/hibernate-configuration&gt;</pre>
<p>En este caso es la exportación del schema de una base de datos Firebird embebida.</p>
<p>Esta herramienta me ha sido de mucha utilidad. Estoy desarrollando una aplicación en SQL Server 2005 y NHibernate, pero, me dí cuenta que la aplicación debía ser portable, de modo que tuve que migrar la base de datos a una portable, y como Firebird está pasando todos los test de NH, la elegí. Ya tenía los hbm, así que no requirió trabajo demás.</p>
<p>Importante para la generación con Firebird: en el directorio de salida entonces tendriamos que tener: fbembed.dll, FirebirdSql.Data.FirebirdClient.dll, y hibernate.cfg.xml.</p>
<p>Si quieren saber como trabajar con MyGeneration y Firebird embedded léanse este <a href="http://lmsilvero.blogspot.com/2006/11/tip-mygeneration-firebird-embedded.html" title="Configurar el uso de MyGeneration + Firebird embedded">post </a>de mi amigo Matias.</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.darioquintana.com.ar/2006/11/12/using-nhibernatetoolhbm2ddl/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Predicados y especificaciones</title>
		<link>http://blog.darioquintana.com.ar/2006/10/07/predicados-y-especificaciones/</link>
		<comments>http://blog.darioquintana.com.ar/2006/10/07/predicados-y-especificaciones/#comments</comments>
		<pubDate>Sat, 07 Oct 2006 15:11:16 +0000</pubDate>
		<dc:creator>Dario Quintana</dc:creator>
				<category><![CDATA[.NET]]></category>
		<category><![CDATA[C#]]></category>
		<category><![CDATA[patrones]]></category>

		<guid isPermaLink="false">http://blog.darioquintana.com.ar/?p=37</guid>
		<description><![CDATA[<p>Inspirado en este <a href="http://www.jeffperrin.com/index.php/2006/06/28/specification-pattern-with-predicates">post</a>, decidí hacerme un ejemplito de predicados en .Net y así utilizar el patrón especificaciones.</p> <p>Un predicado es un delegado que apunta a funciones que devuelven un valor booleano y aceptan un objeto genérico.</p> <p>Vamos a ver una forma interesante de hacer filtrados en base a ciertos criterios de selección utilizando [...]]]></description>
			<content:encoded><![CDATA[<p>Inspirado en este <a href="http://www.jeffperrin.com/index.php/2006/06/28/specification-pattern-with-predicates">post</a>, decidí hacerme un ejemplito de predicados en .Net y así utilizar el patrón especificaciones.</p>
<p>Un predicado es un delegado que apunta a funciones que devuelven un valor booleano y aceptan un objeto genérico.</p>
<p>Vamos a ver una forma interesante de hacer filtrados en base a ciertos criterios de selección utilizando estos dichosos predicados de .Net.</p>
<p>Ciertamente podríamos implementar esto de la forma que siempre se hace, realizar un filtrado, iterando en una colección, y preguntando si tal elemento, se corresponde con el criterio elegido. Por ejemplo: recorrer la lista y vamos preguntando: este cliente&#8230;tiene correo gmail ?</p>
<p>Podría esbozarse un código como este:</p>
<pre> static public IList&lt;Cliente&gt; HasGmail(IList&lt;Cliente&gt; lista)
        {
            IList&lt;Cliente&gt; lista_resultado = new List&lt;Cliente&gt;();

            foreach(Cliente c in lista)
            {
                if(c.Email.Contains("@gmail.com"))
                {
                    lista_resultado.Add(c);
                }
            }
            return lista_resultado;
        }</pre>
<p>Y se llamaría así:</p>
<pre>IList&lt;Cliente&gt; usuariosDeGmail = ClienteFinder.HasGmail(lista);</pre>
<p>Pero ahora bien, se podría objetizar el código, y hacerlo un poco más flexible, y hacer uso de predicados.</p>
<p>Podríamos reemplazarlos por esto:</p>
<pre>IList&lt;Cliente&gt; usuariosDeGmail = </pre>
<pre>                new ClienteFinder(lista).Find(EmailSpec.HasGmail);</pre>
<p>Parecería estar más complicado, pero el concepto es sencillo y aplica el patrón de especificaciones, mediante predicatos genéricos.</p>
<p>Vamos al codigo de la entidad de negocio de la cual tenemos un listado y la queremos obtener por un criterio: la entidad Cliente.</p>
<pre>public class Cliente
    {
        public Cliente()
        { }

        public Cliente(string nombre, string email)
        {
            this.nombre = nombre;
            this.email = email;
        }
        private string nombre;

        public string Nombre
        {
            get { return nombre; }
            set { nombre = value; }
        }

        private string email;

        public string Email
        {
            get { return email; }
            set { email = value; }
        }</pre>
<pre>    }</pre>
<p>El código principal sería así:</p>
<pre> static void Main(string[] args)
        {
            CargarLista();

            //IList&lt;Cliente&gt; usuariosDeHotmail = new ClienteFinder(lista).Find(EmailSpec.HasHotmail);
            IList&lt;Cliente&gt; usuariosDeGmail = new ClienteFinder(lista).Find(EmailSpec.HasGmail);

            foreach (Cliente cliente in usuariosDeGmail)
            {
                Console.WriteLine("Email: {0}", cliente.Email);
            }

            Console.Read();
        }</pre>
<p>Veamos el código de las <strong>especificaciones </strong>que se puede aplicar para obtener distintos criterios de filtrado:</p>
<pre>public class EmailSpec
{
    public static Predicate&lt;Cliente&gt; HasHotmail
    {
        get{
            return delegate(Cliente cliente)
            {
                return cliente.Email.Contains("@hotmail.com");
            };

        }
    }

    public static Predicate&lt;Cliente&gt; HasGmail
    {
        get
        {
            return EmailSpec.MethodHasGmail;
        }
    }

    public static bool MethodHasGmail(Cliente cliente)
    {
        return cliente.Email.Contains("@gmail.com");
    }

    public static Predicate&lt;Cliente&gt; HasYahoo
    {
        get
        {
            return new Predicate&lt;Cliente&gt;(EmailSpec.MethodHasYahoo);
        }
    }

    public static bool MethodHasYahoo(Cliente cliente)
    {
        return cliente.Email.Contains("@yahoo.com");
    }

}</pre>
<p>Aquí podemos ver, primeramente el uso de retorno de delegados usando Métodos anónimos (en HasHotmail), delegados con inferencia de tipos (en HasGmail) y la forma natural de usar un delegado (en HasYahoo). Estas son tres formas de hacer lo mismo, y yo recomiendo usar <strong>métodos anónimos</strong> que se vé en la propiedad HasHotmail y en este caso, el código se vuelve mucho más chico.</p>
<pre> public static Predicate&lt;Cliente&gt; HasHotmail
    {
        get{
            return delegate(Cliente cliente)
            {
                return cliente.Email.Contains("@hotmail.com");
            };

        }
    }</pre>
<p>Vemos que la propiedad es de sólo lectura, y que también, retorna un predicado, que hablando mal, devolvería la función que se encargaría de la evaluación&#8230;y esa función&#8230;devolvería un booleano&#8230;true OR false, si cumple ó no. Muy prolijo no ?  Sería lo mismo hacer:</p>
<pre>  public static Predicate&lt;Cliente&gt; HasHotmail
    {
        get{
            return delegate(Cliente cliente)
            {
                if(cliente.Email.Contains("@hotmail.com"))
                    return true;
                else
                    return false;
            };

        }
    }</pre>
<p>Ahora veamos el código de ClienteFinder:</p>
<pre>public class ClienteFinder
{
    private IList&lt;Cliente&gt; _lista;

    public ClienteFinder(IList&lt;Cliente&gt; lista)
    {
        _lista = lista;
    }

    public IList&lt;Cliente&gt; Find(Predicate&lt;Cliente&gt; predicate)
    {
        List&lt;Cliente&gt; encontrados = new List&lt;Cliente&gt;();

        foreach (Cliente cliente in _lista)
        {
            if (predicate(cliente))
            {
                encontrados.Add(cliente);
            }
        }

        return encontrados;
    }

}</pre>
<p>Lo importante acá es el constructor, que va a recibir la lista a ser filtrada. Y también el método Find, quien va a recibir el predicado correspondiente al criterio de selección. Es decir que Find puede recibir cualquiera de las tres especificaciones que preparamos: HasHotmail, HasGmail, HasYahoo, y realizar el filtrado en base a ellas.</p>
<p><strong>Recursos: </strong></p>
<ul>
<li>El código completo usando predicados se puede encontrar <a href="http://uooopaa.googlepages.com/predicates.cs">aquí</a>.</li>
<li>El código sin predicados, de la manera silvestre está <a href="http://uooopaa.googlepages.com/sin_predicates.cs">aquí</a>.</li>
<li>Para los que leen VB.Net <a href="http://uooopaa.googlepages.com/predicates.vb">aquí </a>les vá&#8230;no pidan Metodos anónimos.</li>
<li>Sigo recomendando este artículo: <a href="http://msdn.microsoft.com/msdnmag/issues/06/00/C20/" title="Create Elegant Code With Anonymous Methods, Iterators, And Partial Classes">Create Elegant Code With Anonymous Methods, Iterators, And Partial Classes</a></li>
<li>Post anterior sobre: <a href="http://darionet.wordpress.com/2006/09/23/delegados-eventos-y-mtodos-annimos/">Delegados, Eventos y Métodos anónimos</a></li>
<li>Y en esté <a href="http://blogs.msdn.com/abhinaba/archive/2005/10/18/482180.aspx" title="C#: Anonymous methods are not closures">artículo</a>, se explica el porqué, los métodos anónimos C#, no son closures, soportadas nativamente por Ruby. Pero esto es tema para otros post, pero les dejo la inquietud.</li>
</ul>
]]></content:encoded>
			<wfw:commentRss>http://blog.darioquintana.com.ar/2006/10/07/predicados-y-especificaciones/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Delegados, Eventos y M&#233;todos an&#243;nimos</title>
		<link>http://blog.darioquintana.com.ar/2006/09/23/delegados-eventos-y-mtodos-annimos/</link>
		<comments>http://blog.darioquintana.com.ar/2006/09/23/delegados-eventos-y-mtodos-annimos/#comments</comments>
		<pubDate>Sat, 23 Sep 2006 13:38:00 +0000</pubDate>
		<dc:creator>Dario Quintana</dc:creator>
				<category><![CDATA[.NET]]></category>
		<category><![CDATA[C#]]></category>
		<category><![CDATA[patrones]]></category>

		<guid isPermaLink="false">http://blog.darioquintana.com.ar/?p=34</guid>
		<description><![CDATA[<p>Introducción: Implementando una interfaz gráfica con windows forms, teniendo un MDI principal y un par de formularios hijos, vi la necesidad que en un momento dado, un formulario hijo realice algo que el padre tiene que interceptar, y tomar cartas en el asunto. En este caso necesitaba setear la propiedad Text del MDI, a partir [...]]]></description>
			<content:encoded><![CDATA[<p><em>Introducción:</em> Implementando una interfaz gráfica con windows forms, teniendo un MDI principal y un par de formularios hijos, vi la necesidad que en un momento dado, un formulario hijo realice algo que el padre tiene que interceptar, y tomar cartas en el asunto. En este caso necesitaba setear la propiedad Text del MDI, a partir de alguna acción de un formulario hijo; algo sencillo.</p>
<p>En C# y sin la posibilidad de usar algo análogo al namespace <strong>My</strong>, que posee la gente de VB.Net, tuve que recurrir a un Eventos y Delegados,&#8230;y ya que estamos&#8230;Métodos anónimos.</p>
<p>En VB.Net, <strong>estando en formulario hijo</strong> con el namespace my seria algo bastante tonto:</p>
<p>My.Forms.MDIMain.Text = nombredeltitulo</p>
<p>En C# me las arregle con un mecanismo que permita que el padre (MDI principal) se quede a la &#8220;escucha&#8221; de un evento, y así iniciar acciones, pero con información que le provee el hijo. Es decir:</p>
<ul>
<li><strong>Los metodos a ejecutar</strong>: son del MDI principal</li>
<li><strong>Y la información necesaria -los parametros-</strong> : provienen del form hijo.</li>
</ul>
<p>Ahora bien, como se podrían implementar estos tres conceptos juntos para resolver esto ?</p>
<p>Ahora pasemos a un ejemplo donde se vé una interacción entre los objetos:</p>
<p><!-- code formatted by http://manoli.net/csharpformat/ --></p>
<pre class="csharpcode">
<span class="kwrd">using</span> System;<span class="rem">// Declaracion del delegado</span>

<span class="kwrd">public</span> <span class="kwrd">delegate</span> <span class="kwrd">void</span> EventHandler(<span class="kwrd">string</span> str);

<span class="kwrd">public</span> <span class="kwrd">class</span> Program
{

    <span class="kwrd">public</span> <span class="kwrd">static</span> <span class="kwrd">void</span> Main()
    {

        TestHandler tb = <span class="kwrd">new</span> TestHandler();

        <span class="rem">//Tres maneras de hacer lo mismo</span>

        <span class="rem">//1- asignacion comun</span>

        tb.Evento += <span class="kwrd">new</span> EventHandler(MetodoStringToUpper);

        <span class="rem">//2- asignacion por inferencia de tipos</span>

        tb.Evento += MetodoStringToLower;

        <span class="rem">//3- asignacion con metodo anonimo</span>

        tb.Evento += <span class="kwrd">delegate</span>(<span class="kwrd">string</span> str)
        {
            <span class="kwrd">string</span> otrostring = String.Format(<span class="str">"Metodo Anonimo: {0}"</span>, str);
            Console.WriteLine(otrostring);
        };

        tb.Disparar(); Console.ReadLine();

    }

    <span class="kwrd">public</span> <span class="kwrd">static</span> <span class="kwrd">void</span> MetodoStringToUpper(<span class="kwrd">string</span> str)
    {
        Console.WriteLine(str.ToUpper());
    }

    <span class="kwrd">public</span> <span class="kwrd">static</span> <span class="kwrd">void</span> MetodoStringToLower(<span class="kwrd">string</span> str)
    {
        Console.WriteLine(str.ToLower());
    }

}

<span class="kwrd">class</span> TestHandler
{

    <span class="rem">//Evento de tipo EventHandler</span>

    <span class="kwrd">public</span> <span class="kwrd">event</span> EventHandler Evento;

    <span class="kwrd">public</span> <span class="kwrd">void</span> Disparar()
    {

        <span class="kwrd">string</span> mystring = <span class="str">"Dario.Net"</span>;

        <span class="rem">//Disparo el evento, con un string de parametro</span>

        Evento(mystring);
    }

}
</pre>
<p>Primeramente declararemos un delegado: <em><u>EventHandler</u></em>, que podrá apuntar a metodos que contengan como argumentos el tipo <strong>string</strong> y que no retornen valores (<strong>void</strong>).</p>
<p>Luego en la clase TestHandler se declara un evento: <em><u>Evento</u></em>, del tipo EventHandler (nuestro delegado).</p>
<p>Y la funcion: <em><u>Disparar(</u></em>); se encargará de disparar el evento con un string como argumento: <u><em>mystring=&#8221;Dario.Net&#8221;</em></u>.</p>
<p>Vayamos al Main().</p>
<p>Instanciamos un objeto del tipo <u><em>TestHandler</em></u>, con el operador <strong>+=</strong> y vamos agregando al evento, todos los métodos que queremos que se ejecuten, uno tras otro.</p>
<p>Luego invocamos a Disparar(). y se invocan, en este orden los tres métodos: MetodoStringToUpper,MetodoStringToLower y el querido metodo anónimo.</p>
<p>Cosas a notar:</p>
<p>El que dispara el evento es el TestHandler, y le pasa un parámetro: <u>mystring</u>.</p>
<p>Los métodos están en el <u>Main</u>, pero esos métodos se ejecutarán por el hijo&#8230;cosa loca no ?</p>
<p>El método anonimo: es como si fuera un metodo más, pero definido en el momento de su uso, e inline (buenísimo!)</p>
<p>Bien, ahora que vimos el ejemplo (y espero que lo hayan entendido), imaginemos algo: hagamos de cuenta que <u>Program</u> es el Main, y TestHandler es el <u>Form1</u>. Y podemos solucionar facilmente el problema que plantee al comienzo&#8230;y muchos más!</p>
<p>Para profundizar les recomiendo este <a href="https://www.microsoft.com/spanish/msdn/articulos/archivo/030506/voices/C20_default.mspx">artículo</a>.</p>
<p>Saludos y dejen comentarios.</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.darioquintana.com.ar/2006/09/23/delegados-eventos-y-mtodos-annimos/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
	</channel>
</rss>

