<?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; IoC</title>
	<atom:link href="http://blog.darioquintana.com.ar/category/ioc/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>No nos llames, nosotros lo haremos</title>
		<link>http://blog.darioquintana.com.ar/2008/05/02/no-nos-llames-nosotros-lo-haremos/</link>
		<comments>http://blog.darioquintana.com.ar/2008/05/02/no-nos-llames-nosotros-lo-haremos/#comments</comments>
		<pubDate>Fri, 02 May 2008 16:14:19 +0000</pubDate>
		<dc:creator>Dario Quintana</dc:creator>
				<category><![CDATA[IoC]]></category>

		<guid isPermaLink="false">http://blog.darioquintana.com.ar/2008/05/02/no-nos-llames-nosotros-lo-haremos/</guid>
		<description><![CDATA[<p>Como luce la <a href="http://martinfowler.com/bliki/InversionOfControl.html">Inversión de control</a> un sistema&#160; usado frameworks de desarrollo? </p> <p></p>]]></description>
			<content:encoded><![CDATA[<p>Como luce la <a href="http://martinfowler.com/bliki/InversionOfControl.html">Inversión de control</a> un sistema&nbsp; usado frameworks de desarrollo? </p>
<p><img src="http://uooopaa.googlepages.com/IoC_photo.png"></p>
]]></content:encoded>
			<wfw:commentRss>http://blog.darioquintana.com.ar/2008/05/02/no-nos-llames-nosotros-lo-haremos/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>3 layer Example of NHibernate + Spring.Net + AOP</title>
		<link>http://blog.darioquintana.com.ar/2007/11/17/3-layer-example-of-nhibernate-springnet-aop/</link>
		<comments>http://blog.darioquintana.com.ar/2007/11/17/3-layer-example-of-nhibernate-springnet-aop/#comments</comments>
		<pubDate>Sat, 17 Nov 2007 14:43:55 +0000</pubDate>
		<dc:creator>Dario Quintana</dc:creator>
				<category><![CDATA[AOP]]></category>
		<category><![CDATA[IoC]]></category>
		<category><![CDATA[NHibernate]]></category>
		<category><![CDATA[Spring]]></category>
		<category><![CDATA[uNHAddIns]]></category>

		<guid isPermaLink="false">http://blog.darioquintana.com.ar/2007/11/17/3-layer-example-of-nhibernate-springnet-aop/</guid>
		<description><![CDATA[<p>Hace un tiempo escrib&#xED; este proyecto plantilla usando <a href="http://springframework.net/">Spring.Net</a> y <a href="http://www.hibernate.org/343.html">NHibernate</a>principalmente. Us&#xE9; NHibernate para el acceso a datos obviamente y <a href="http://springframework.net/">Spring.Net</a> para aplicar <a href="http://blog.darioquintana.com.ar/2006/12/28/inyeccin-de-dependencia-con-springnet/">IoC</a> y <a href="http://en.wikipedia.org/wiki/Aspect-oriented_programming">Aop</a>.</p> <p>Esta es la clase CustomerService:</p> public class CustomerService : BaseService, ICustomerService { /// &#60;summary&#62; /// This field is inyected by IoC through the property. [...]]]></description>
			<content:encoded><![CDATA[<p>Hace un tiempo escrib&#xED; este proyecto plantilla usando <a href="http://springframework.net/">Spring.Net</a> y <a href="http://www.hibernate.org/343.html">NHibernate</a>principalmente. Us&#xE9; NHibernate para el acceso a datos obviamente y <a href="http://springframework.net/">Spring.Net</a> para aplicar <a href="http://blog.darioquintana.com.ar/2006/12/28/inyeccin-de-dependencia-con-springnet/">IoC</a> y <a href="http://en.wikipedia.org/wiki/Aspect-oriented_programming">Aop</a>.</p>
<p>Esta es la clase <em>CustomerService</em>:</p>
<pre class="csharpcode">
    <span class="kwrd">public</span> <span class="kwrd">class</span> CustomerService : BaseService, ICustomerService
    {
	<span class="rem">/// &lt;summary&gt;</span>
        <span class="rem">/// This field is inyected by IoC through the property.</span>
        <span class="rem">/// &lt;/summary&gt;</span>

        <span class="kwrd">private</span> ICustomerDao customerDao;        <span class="kwrd"></span>
 <span class="kwrd">	public</span> ICustomerDao CustomerDao {
            get { <span class="kwrd">return</span> customerDao; }
          set { customerDao = <span class="kwrd">value</span>; }
        }

<span class="preproc">#region</span> ICustomerService Members

<span class="kwrd">	public</span> <span class="kwrd">int</span> CreateCustomer(<span class="kwrd">string</span> Name, <span class="kwrd">string</span> LastName) {

        	Customer customer = <span class="kwrd">new</span> Customer();

        	customer.FirstName = <span class="str">"Dario"</span>;

	        customer.LastName = <span class="str">"Quintana"</span>;

		CustomerDao.Save(customer);

<span class="kwrd">		return</span> customer.Id;

        }

<span class="kwrd">	public</span> <span class="kwrd">void</span> DeleteCustomer(<span class="kwrd">int</span> Id) {

            	Customer customer = CustomerDao.GetById(Id);

		CustomerDao.Delete(customer);

        }

<span class="preproc">#endregion</span>

    }</pre>
<p>Como se puede apreciar las clases <em>CreateCustomer</em> &#xF3; <em>DeleteCustomer</em> no est&#xE1;n envueltas en un codigo Transactional o de UnitOfWork, tampoco el m&#xE9;todo <em>Save(customer)</em> en la clase <em>CustomerDao</em>.</p>
<p>Entonces&#8230; donde est&#xE1; el soporte transaccional? Spring + AOP es la respuesta. Spring envuelve a los metodos del Servicio entre transacciones. Y la respuesta para esto son los proxies.</p>
<p>Cuando se realiza la instanciaci&#xF3;n de la clase CustomerService, un proxy es instanciado. Con el proxy de nuestra clase Spring.Net puede envolver los metodos configurados dentro de transacciones. Muy bueno no ? </p>
<p>Otra cosa que pueden apreciar en el ejemplo es el uso de <a href="http://code.google.com/p/unhaddins/">uNhAddIns</a> en el repositorio. Con esta librer&#xED;a podemos usar queries &quot;detachadas&quot; o separadas de un contexto de persistencia por medio de la clase <a href="http://blog.darioquintana.com.ar/2007/09/06/unhaddins-unofficial-nhibernate-addins/">DetachedQuery</a>. Con DetachedQuery podemos hacer uso indistinto de Hql/SqlNativo en NamedQueries, <a href="http://blog.darioquintana.com.ar/2007/10/16/named-queries-en-nhibernate-y-por-qu-debemos-usarlas/">y esto es una buena pr&#xE1;ctica que debemos tratar de adoptar</a>.</p>
<h4><a href="http://code.google.com/p/darioquintana/downloads/detail?name=SpringNHAop.7z">Descargar el ejemplo</a></h4>
</p>
<pre></pre></p>
]]></content:encoded>
			<wfw:commentRss>http://blog.darioquintana.com.ar/2007/11/17/3-layer-example-of-nhibernate-springnet-aop/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Mono.Sms y Windsor Container</title>
		<link>http://blog.darioquintana.com.ar/2007/05/23/monosms-y-windsor-container/</link>
		<comments>http://blog.darioquintana.com.ar/2007/05/23/monosms-y-windsor-container/#comments</comments>
		<pubDate>Wed, 23 May 2007 05:35:23 +0000</pubDate>
		<dc:creator>Dario Quintana</dc:creator>
				<category><![CDATA[IoC]]></category>
		<category><![CDATA[Mono]]></category>
		<category><![CDATA[monosms]]></category>

		<guid isPermaLink="false">http://blog.darioquintana.com.ar/2007/05/23/monosms-y-windsor-container/</guid>
		<description><![CDATA[<p>Para ponerle un poco de sabor al Core de Mono.Sms, una de las cosas que me encargué de añadir es la capacidad solicitar los proveedores que estén disponibles para enviar mensajes por medio de un container de <a href="http://en.wikipedia.org/wiki/Inversion_of_control">IoC</a>. Para los que no sepan que es esto, pueden tener una introducción <a href="http://blog.darioquintana.com.ar/2006/12/28/inyeccin-de-dependencia-con-springnet/">aquí</a>&#160;con Spring.Net, o [...]]]></description>
			<content:encoded><![CDATA[<p>Para ponerle un poco de sabor al Core de Mono.Sms, una de las cosas que me encargué de añadir es la capacidad solicitar los proveedores que estén disponibles para enviar mensajes por medio de un container de <a href="http://en.wikipedia.org/wiki/Inversion_of_control">IoC</a>. Para los que no sepan que es esto, pueden tener una introducción <a href="http://blog.darioquintana.com.ar/2006/12/28/inyeccin-de-dependencia-con-springnet/">aquí</a>&nbsp;con Spring.Net, o <a href="http://blog.bittercoder.com/PermaLink,guid,bc382e38-a6c6-4e98-840e-ea00d635fc5e.aspx">aquí utilizando Windsor</a>.</p>
<p>Para&nbsp;dicha Inversion de Control (IoC)&nbsp;estoy usando <a href="http://www.castleproject.org/container/index.html">Windsor Container</a>. </p>
<p>Este caso todos los proveedores son inyectados, es decir, dejo que el container me entregue en mano, todas la implementaciones existentes de <strong>IProvider</strong>&nbsp;para la aplicación. Cada proveedor implementa la interfaz <strong>IProvider</strong>:</p>
<pre class="csharpcode"><span class="kwrd">namespace</span> Mono.Sms.Core.Provider
{
    <span class="kwrd">public</span> <span class="kwrd">interface</span> IProvider
    {
        <span class="kwrd">string</span> Name { get; set; }
        <span class="kwrd">string</span> Domain { get; set; }
        <span class="kwrd">bool</span> UseSmtp { get; set; }
        <span class="kwrd">string</span> HostName { get; set; }
        <span class="kwrd">string</span> DataPost { get; }
        <span class="kwrd">string</span> Sign { get; }
        <span class="kwrd">string</span> Message { get; set; }
        CelNumber CelNumber { get; set; }
        <span class="kwrd">int</span> NumberOfCharacters { set; get; }
        <span class="kwrd">string</span> Description { get; set; }
    }
}</pre>
<p>&nbsp;y luego configuro los proveedores para que Windsor sepa sobre ellos y pueda crear los objetos:&nbsp;</p>
<pre class="csharpcode" style="width: 485px; height: 623px">  <span class="kwrd">&lt;</span><span class="html">castle</span><span class="kwrd">&gt;</span>
    <span class="kwrd">&lt;</span><span class="html">components</span><span class="kwrd">&gt;</span>
      <span class="kwrd">&lt;</span><span class="html">component</span>
        <span class="attr">id</span><span class="kwrd">="ProviderPersonalPost"</span>
        <span class="attr">service</span><span class="kwrd">="Mono.Sms.Core.Provider.IProvider, Mono.Sms"</span>
        <span class="attr">type</span><span class="kwrd">="Mono.Sms.Core.Provider.PersonalProvider, Mono.Sms"</span>
        <span class="attr">lyfestyle</span><span class="kwrd">="singleton"</span>
        <span class="kwrd">&gt;</span>
        <span class="kwrd">&lt;</span><span class="html">parameters</span><span class="kwrd">&gt;</span>
          <span class="kwrd">&lt;</span><span class="html">Name</span><span class="kwrd">&gt;</span>Personal<span class="kwrd">&lt;/</span><span class="html">Name</span><span class="kwrd">&gt;</span>
          <span class="kwrd">&lt;</span><span class="html">Domain</span><span class="kwrd">&gt;</span>@personal-net.com.ar<span class="kwrd">&lt;/</span><span class="html">Domain</span><span class="kwrd">&gt;</span>
          <span class="kwrd">&lt;</span><span class="html">UseSmtp</span><span class="kwrd">&gt;</span>false<span class="kwrd">&lt;/</span><span class="html">UseSmtp</span><span class="kwrd">&gt;</span>
          <span class="kwrd">&lt;</span><span class="html">HostName</span><span class="kwrd">&gt;</span>host25.200-43-139.telecom.net.ar<span class="kwrd">&lt;/</span><span class="html">HostName</span><span class="kwrd">&gt;</span>
          <span class="kwrd">&lt;</span><span class="html">Port</span><span class="kwrd">&gt;</span>80<span class="kwrd">&lt;/</span><span class="html">Port</span><span class="kwrd">&gt;</span>
          <span class="kwrd">&lt;</span><span class="html">NumberOfCharacters</span><span class="kwrd">&gt;</span>138<span class="kwrd">&lt;/</span><span class="html">NumberOfCharacters</span><span class="kwrd">&gt;</span>
          <span class="kwrd">&lt;</span><span class="html">Description</span><span class="kwrd">&gt;</span>Este proveedor permite la entrega de
          mensajes a un celular Personal<span class="kwrd">&lt;/</span><span class="html">Description</span><span class="kwrd">&gt;</span>
        <span class="kwrd">&lt;/</span><span class="html">parameters</span><span class="kwrd">&gt;</span>
      <span class="kwrd">&lt;/</span><span class="html">component</span><span class="kwrd">&gt;</span>

      <span class="kwrd">&lt;</span><span class="html">component</span>
      <span class="attr">id</span><span class="kwrd">="ProviderPersonalMail"</span>
      <span class="attr">service</span><span class="kwrd">="Mono.Sms.Core.Provider.IProvider, Mono.Sms"</span>
      <span class="attr">type</span><span class="kwrd">="Mono.Sms.Core.Provider.PersonalProvider, Mono.Sms"</span>
      <span class="attr">lyfestyle</span><span class="kwrd">="singleton"</span>
        <span class="kwrd">&gt;</span>
        <span class="kwrd">&lt;</span><span class="html">parameters</span><span class="kwrd">&gt;</span>
          <span class="kwrd">&lt;</span><span class="html">Name</span><span class="kwrd">&gt;</span>Personal<span class="kwrd">&lt;/</span><span class="html">Name</span><span class="kwrd">&gt;</span>
          <span class="kwrd">&lt;</span><span class="html">Domain</span><span class="kwrd">&gt;</span>@personal-net.com.ar<span class="kwrd">&lt;/</span><span class="html">Domain</span><span class="kwrd">&gt;</span>
          <span class="kwrd">&lt;</span><span class="html">UseSmtp</span><span class="kwrd">&gt;</span>true<span class="kwrd">&lt;/</span><span class="html">UseSmtp</span><span class="kwrd">&gt;</span>
          <span class="kwrd">&lt;</span><span class="html">HostName</span><span class="kwrd">&gt;</span>host25.200-43-139.telecom.net.ar<span class="kwrd">&lt;/</span><span class="html">HostName</span><span class="kwrd">&gt;</span>
          <span class="kwrd">&lt;</span><span class="html">Port</span><span class="kwrd">&gt;</span>80<span class="kwrd">&lt;/</span><span class="html">Port</span><span class="kwrd">&gt;</span>
          <span class="kwrd">&lt;</span><span class="html">NumberOfCharacters</span><span class="kwrd">&gt;</span>110<span class="kwrd">&lt;/</span><span class="html">NumberOfCharacters</span><span class="kwrd">&gt;</span>
          <span class="kwrd">&lt;</span><span class="html">Description</span><span class="kwrd">&gt;</span>Este proveedor permite la entrega de mensajes
          a un celular Personal utilizando mails.<span class="kwrd">&lt;/</span><span class="html">Description</span><span class="kwrd">&gt;</span>
        <span class="kwrd">&lt;/</span><span class="html">parameters</span><span class="kwrd">&gt;</span>
      <span class="kwrd">&lt;/</span><span class="html">component</span><span class="kwrd">&gt;</span>
    <span class="kwrd">&lt;/</span><span class="html">components</span><span class="kwrd">&gt;</span>
  <span class="kwrd">&lt;/</span><span class="html">castle</span><span class="kwrd">&gt;</span></pre>
<p>En este caso hemos creado 2 implementaciones para enviar mensajes a una misma empresa, una forma es haciendo un post, y la otra utilzando mails. Hablando en el idioma de Windsor container, hemos creado aquí 2 <strong>Componentes (ProviderPersonalPost y ProviderPersonalMail)</strong>, para un mismo <strong>Servicio (IProvider)</strong>.</p>
<p>Luego para pedirle&nbsp;al container que nos entregue todas las implementaciones de los servicios <strong>IProvider</strong>, realizo esta siguiente iteración:</p>
<pre class="csharpcode" style="width: 579px; height: 191px">  <span class="kwrd">public</span> IList&lt;IProvider&gt; GetAllProviders()
        {
            IHandler[] handles = container.Kernel.GetHandlers(<span class="kwrd">typeof</span> (IProvider));
            IList&lt;IProvider&gt; providersImpl = <span class="kwrd">new</span> List&lt;IProvider&gt;();

            <span class="kwrd">foreach</span> (IHandler hdlr <span class="kwrd">in</span> handles)
            {
                providersImpl.Add((IProvider)hdlr.Resolve(CreationContext.Empty));
            }

            <span class="kwrd">return</span> providersImpl;
        }</pre>
<p>Se puede ver que agrego a una lista <strong>providersImpl</strong> todos los proveedores y los retorno. Y con esto tengo en mano a todos los proveedores con los que puedo mandar mensajes. </p>
<p>Se preguntarán: &#8220;Es necesario todo esto para una simple aplicación de sms?&#8221;, la respuesta es &#8220;No&#8221;. Como se sabe, IoC es un principio de diseño, y no un requerimiento indispensable. </p>
<p>Opiniones ? Sientanse como en casa <img src='http://blog.darioquintana.com.ar/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
]]></content:encoded>
			<wfw:commentRss>http://blog.darioquintana.com.ar/2007/05/23/monosms-y-windsor-container/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Mono.Sms para enviar mensajes</title>
		<link>http://blog.darioquintana.com.ar/2007/05/19/monosms-para-enviar-mensajes/</link>
		<comments>http://blog.darioquintana.com.ar/2007/05/19/monosms-para-enviar-mensajes/#comments</comments>
		<pubDate>Sat, 19 May 2007 07:32:35 +0000</pubDate>
		<dc:creator>Dario Quintana</dc:creator>
				<category><![CDATA[IoC]]></category>
		<category><![CDATA[Mono]]></category>
		<category><![CDATA[monosms]]></category>

		<guid isPermaLink="false">http://blog.darioquintana.com.ar/2007/05/19/monosms-para-enviar-mensajes/</guid>
		<description><![CDATA[<p>Mono.Sms es una aplicación que se escribió&#160;para mandar mensajes de texto en Argentina a clientes de empresas como Personal, Cti, y Movistar. La ventaja es que lo podemos correr tanto en Linux y Windows. Aquí les mando un screenshot del preview:</p> <p>&#160;</p> <p>Dentro de poco se podrá bajar el binario para usarlo, con los nombres [...]]]></description>
			<content:encoded><![CDATA[<p>Mono.Sms es una aplicación que se escribió&nbsp;para mandar mensajes de texto en Argentina a clientes de empresas como Personal, Cti, y Movistar. La ventaja es que lo podemos correr tanto en Linux y Windows. Aquí les mando un screenshot del preview:</p>
<p><img src="http://uooopaa.googlepages.com/monosms-preview.png">&nbsp;</p>
<p>Dentro de poco se podrá bajar el binario para usarlo, con los nombres de los coders de esta app.</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.darioquintana.com.ar/2007/05/19/monosms-para-enviar-mensajes/feed/</wfw:commentRss>
		<slash:comments>11</slash:comments>
		</item>
		<item>
		<title>AOP en el Enterprise Library?</title>
		<link>http://blog.darioquintana.com.ar/2007/02/24/aop-en-el-enterprise-library/</link>
		<comments>http://blog.darioquintana.com.ar/2007/02/24/aop-en-el-enterprise-library/#comments</comments>
		<pubDate>Sat, 24 Feb 2007 05:41:46 +0000</pubDate>
		<dc:creator>Dario Quintana</dc:creator>
				<category><![CDATA[.NET]]></category>
		<category><![CDATA[AOP]]></category>
		<category><![CDATA[enterprise-library]]></category>
		<category><![CDATA[IoC]]></category>

		<guid isPermaLink="false">http://blog.darioquintana.com.ar/2007/02/24/aop-en-el-enterprise-library/</guid>
		<description><![CDATA[<p>Un nuevo Application Block nació: Policy Injection Application Block. </p> <p>Al parecer, con este nuevo App Block podremos aplicar conceptos como el de <a href="http://en.wikipedia.org/wiki/Separation_of_concerns">SoC (Separation of concerns)</a> en nuestra aplicación, tal como lo venían predicando de manera similar frameworks como <a href="http://springframework.net/">Spring.Net</a>.</p> <p>Para ser claro, podriamos hacer que en&#160;un objeto de nuestra aplicación, al [...]]]></description>
			<content:encoded><![CDATA[<p>Un nuevo Application Block nació: <strong><u>Policy Injection Application Block</u></strong>. </p>
<p>Al parecer, con este nuevo App Block podremos aplicar conceptos como el de <a href="http://en.wikipedia.org/wiki/Separation_of_concerns">SoC (Separation of concerns)</a> en nuestra aplicación, tal como lo venían predicando de manera similar frameworks como <a href="http://springframework.net/">Spring.Net</a>.</p>
<p>Para ser claro, podriamos hacer que en&nbsp;un objeto de nuestra aplicación, al ejecutarse un método, realice una entrada al archivo de log, de forma transparente en el código cliente.&nbsp;</p>
<p>Esto se pone más interesante, en la <strong>interoperabilidad</strong> que podremos llegar a tener con otros App Blocks, como ser: <strong>Validation, Logging, Exception</strong> entre otros. </p>
<p>La idea básica es trabajar con una factoría de clases, para la instanciación de nuestros objetos.&nbsp;Dicha factoria inspeccionará la configuración, para ver si el objeto posee politicas que aplicar, si no las posee, se crea una instancia común y corriente, si las posee, se crea un proxy para que el framework pueda manejar al objeto de forma transparente al cliente.</p>
<p><u>Escenario donde podriamos aplicar:</u></p>
<p>En nuestra aplicación un objeto que posee un método <strong>Guardar(Cliente obj). </strong>Utilizando estos conceptos, podríamos hacer que cada vez que se llame a este método, es decir, que querramos guardar un cliente, por medio del<strong> Policy Injection App Block</strong> se realize la validación del objeto (utilizando el <strong>Validation App Block</strong>), y si no es una entidad válida,&nbsp;dicho método&nbsp;<strong>Guardar </strong>no se ejecute. </p>
<p><u>Para más lean estos posts:</u></p>
<ul>
<li><a href="http://blogs.msdn.com/tomholl/archive/2007/02/23/announcing-the-policy-injection-application-block.aspx">Announcing the Policy Injection Application Block</a></li>
<li><a href="http://blogs.msdn.com/edjez/archive/2007/02/23/policy-injection-app-block-behind-the-scenes.aspx">Policy Injection App Block &#8211; Behind the Scenes</a></li>
</ul>
]]></content:encoded>
			<wfw:commentRss>http://blog.darioquintana.com.ar/2007/02/24/aop-en-el-enterprise-library/feed/</wfw:commentRss>
		<slash:comments>1</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>
	</channel>
</rss>

