<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" media="screen" href="/~d/styles/rss2full.xsl"?><?xml-stylesheet type="text/css" media="screen" href="http://feeds.feedburner.com/~d/styles/itemcontent.css"?><rss xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:sy="http://purl.org/rss/1.0/modules/syndication/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/" xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0" version="2.0">

<channel>
	<title>El Blog de Fox</title>
	
	<link>http://blog.foxandxss.net</link>
	<description>Fomentando el desarrollo libre bajo .NET</description>
	<lastBuildDate>Tue, 01 Nov 2011 23:32:17 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.2.1</generator>
		<atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="self" type="application/rss+xml" href="http://feeds.feedburner.com/ElBlogDeFox" /><feedburner:info uri="elblogdefox" /><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="hub" href="http://pubsubhubbub.appspot.com/" /><item>
		<title>He creado un nuevo blog</title>
		<link>http://feedproxy.google.com/~r/ElBlogDeFox/~3/4t2Af2tQzcQ/he-creado-un-nuevo-blog</link>
		<comments>http://blog.foxandxss.net/he-creado-un-nuevo-blog#comments</comments>
		<pubDate>Tue, 01 Nov 2011 23:29:54 +0000</pubDate>
		<dc:creator>Fox</dc:creator>
				<category><![CDATA[Noticias]]></category>

		<guid isPermaLink="false">http://blog.foxandxss.net/?p=550</guid>
		<description><![CDATA[Hola, hace tiempo que no escribo pues estoy aprendiendo Django y como estoy liado por otros lados pues no puedo darle a .NET todo lo que me gustaría. Para quien esté interesado en Django y lo que gira alrededor de este, os dejo la URL: PyBlog Esto no quiere decir que abandone este blog, pero [...]]]></description>
			<content:encoded><![CDATA[<p>Hola, hace tiempo que no escribo pues estoy aprendiendo <strong>Django</strong> y como estoy liado por otros lados pues no puedo darle a .NET todo lo que me gustaría.</p>
<p>Para quien esté interesado en Django y lo que gira alrededor de este, os dejo la URL:</p>
<p><a href="http://pyblog.foxandxss.net/" title="PyBlog" target="_blank">PyBlog</a></p>
<p>Esto no quiere decir que abandone este blog, pero al menos en corto / medio plazo estaré mas enfocado a Django.</p>
<p>Un saludo.</p>
<img src="http://feeds.feedburner.com/~r/ElBlogDeFox/~4/4t2Af2tQzcQ" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://blog.foxandxss.net/he-creado-un-nuevo-blog/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		<feedburner:origLink>http://blog.foxandxss.net/he-creado-un-nuevo-blog</feedburner:origLink></item>
		<item>
		<title>Desplegando ASP.NET MVC y SQL CE 4 donde no hay soporte</title>
		<link>http://feedproxy.google.com/~r/ElBlogDeFox/~3/-X0YLS1oNAE/desplegando-asp-net-mvc-y-sql-ce-4-donde-no-hay-soporte</link>
		<comments>http://blog.foxandxss.net/desplegando-asp-net-mvc-y-sql-ce-4-donde-no-hay-soporte#comments</comments>
		<pubDate>Wed, 21 Sep 2011 16:53:20 +0000</pubDate>
		<dc:creator>Fox</dc:creator>
				<category><![CDATA[Articulos]]></category>
		<category><![CDATA[Deploy]]></category>
		<category><![CDATA[Visual Studio 2010]]></category>

		<guid isPermaLink="false">http://blog.foxandxss.net/?p=529</guid>
		<description><![CDATA[¿Tienes un servidor con Windows e IIS pero no soporta ASP.NET MVC (Cualquier versión)? ¿No soporta SQL SERVER CE 4? Pues cambia de servidor, que te están timando cojones. Venga no, que quizá tenga otras cualidades. ¿Qué podemos hacer? Visual Studio 2010 SP1 (importante que sea el SP1) tiene una opción que sirve para añadir [...]]]></description>
			<content:encoded><![CDATA[<p>¿Tienes un servidor con Windows e IIS pero no soporta <b>ASP.NET MVC</b> (Cualquier versión)? ¿No soporta <b>SQL SERVER CE 4</b>?</p>
<p>Pues cambia de servidor, que te están timando cojones.</p>
<p>Venga no, que quizá tenga otras cualidades.</p>
<p>¿Qué podemos hacer?<br />
<span id="more-529"></span><br />
Visual Studio 2010 SP1 (importante que sea el SP1) tiene una opción que sirve para añadir los <i>.DLL</i> necesarios para poder ejecutar nuestras aplicaciones que usen tanto <b>ASP.NET MVC</b> como <b>SQL SERVER CE 4</b>:</p>
<p><a href="http://blog.foxandxss.net/cosasblog/deployables/01.png"><img alt="" src="http://blog.foxandxss.net/cosasblog/deployables/01.png" class="alignnone" width="389" height="464" /></a></p>
<p>Como véis, está en el menú <i>Project</i> o <i>Proyecto</i> en la versión en castellano.</p>
<p>Si hacemos click:</p>
<p><a href="http://blog.foxandxss.net/cosasblog/deployables/02.png"><img alt="" src="http://blog.foxandxss.net/cosasblog/deployables/02.png" class="alignnone" width="491" height="223" /></a></p>
<p>Nos da para marcar 3 opciones:</p>
<p><b>ASP.NET MVC</b>: Sirve, como bien dice el nombre, para copiar las <i>.DLL</i> necesarias para poder ejecutar <b>ASP.NET MVC</b><br />
<b>ASP.NET Web Pages and Razor syntax</b>: Tenemos que marcar esta opción si usamos el motor <b>Razor</b> en nuestras aplicaciones (Razor++)<br />
<b>SQL Server Compact</b>: Por último con esta opción coopiamos un montón de <i>.DLL</i> para poder usar bases de datos <bSQL Server Compact 4</b> en nuestras aplicaciones.</p>
<p>Y nada más. Desplegamos la aplicación a nuestro servidor y todo funcionará de maravilla.</p>
<p>Un saludo.</p>
<img src="http://feeds.feedburner.com/~r/ElBlogDeFox/~4/-X0YLS1oNAE" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://blog.foxandxss.net/desplegando-asp-net-mvc-y-sql-ce-4-donde-no-hay-soporte/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		<feedburner:origLink>http://blog.foxandxss.net/desplegando-asp-net-mvc-y-sql-ce-4-donde-no-hay-soporte</feedburner:origLink></item>
		<item>
		<title>Truco: Usar Silverlight embebido en ASP.NET MVC</title>
		<link>http://feedproxy.google.com/~r/ElBlogDeFox/~3/FeDS2RHjDUc/truco-usar-silverlight-embebido-en-asp-net-mvc</link>
		<comments>http://blog.foxandxss.net/truco-usar-silverlight-embebido-en-asp-net-mvc#comments</comments>
		<pubDate>Wed, 10 Aug 2011 18:51:59 +0000</pubDate>
		<dc:creator>Fox</dc:creator>
				<category><![CDATA[Trucos]]></category>
		<category><![CDATA[ASP.NET MVC 3]]></category>
		<category><![CDATA[Silverlight]]></category>

		<guid isPermaLink="false">http://blog.foxandxss.net/?p=523</guid>
		<description><![CDATA[Aunque esto puede sonar estúpido (y sí, lo es), usar Silverlight en ASP.NET MVC, por alguna extraña razón ASP.NET MVC guarda el .xap de nuestra aplicación Silverlight en su caché y aunque hagamos cambios a la aplicación (y compilemos vaya) la aplicación no mostrará los cambios. La solución es sencilla: En el &#60;div&#62; donde vamos [...]]]></description>
			<content:encoded><![CDATA[<p>Aunque esto puede sonar estúpido (y sí, lo es), usar <b>Silverlight</b> en ASP.NET MVC, por alguna extraña razón ASP.NET MVC guarda el <b>.xap</b> de nuestra aplicación Silverlight en su caché y aunque hagamos cambios a la aplicación (y compilemos vaya) la aplicación no mostrará los cambios. La solución es sencilla:</p>
<p>En el &lt;div&gt; donde vamos a embeber nuestra aplicación, en el parámetro source, hacemos lo siguiente:</p>
<pre class="brush: xml;">
&lt;param name=&quot;source&quot; value=&quot;@Url.Content(&quot;~/ClientBin/PruebaWCF.SL.xap&quot;)?1&quot;/&gt;
</pre>
<p>2 cosas:</p>
<p>Estamos dandole la URL de nuestro <b>.xap</b> usando un helper de ASP.NET MVC, así cuando hagamos deploy, podrá saber dónde se encuentra el fichero.</p>
<p>Por otro lado, fijaros en el <i>?1</i>, le pasamos por parámetro un valor totalmente arbitrario, con eso invalidamos el caché y hará que cargue el <b>.xap</b> de nuevo.</p>
<p>Una mejora de este truco es hacerlo automáticamente (pues tendríamos que cambiar el parámetro en cada build)</p>
<pre class="brush: xml;">
&lt;param name=&quot;source&quot; value=&quot;@Url.Content(&quot;~/ClientBin/PruebaWCF.SL.xap&quot;)?@DateTime.Now.ToLongTimeString()&quot;/&gt;
</pre>
<p>Así pues generaremos una cadena nueva cada vez que compilemos.</p>
<p>Podemos cambiarlo y llevar la cuenta de cuantos &#8220;builds&#8221; hemos hecho creando una simple clase. Pero vaya, con esto va de sobra para que la cosa funcione como debería de funcionar sin tocar nada&#8230;</p>
<p>Hasta otra (espero que pronto <img src='http://blog.foxandxss.net/wp-includes/images/smilies/icon_razz.gif' alt=':P' class='wp-smiley' /> )</p>
<img src="http://feeds.feedburner.com/~r/ElBlogDeFox/~4/FeDS2RHjDUc" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://blog.foxandxss.net/truco-usar-silverlight-embebido-en-asp-net-mvc/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		<feedburner:origLink>http://blog.foxandxss.net/truco-usar-silverlight-embebido-en-asp-net-mvc</feedburner:origLink></item>
		<item>
		<title>He adquirido una cuenta de AppHub para desarrollar WP7!</title>
		<link>http://feedproxy.google.com/~r/ElBlogDeFox/~3/0_eASDjumks/he-adquirido-una-cuenta-de-apphub-para-desarrollar-wp7</link>
		<comments>http://blog.foxandxss.net/he-adquirido-una-cuenta-de-apphub-para-desarrollar-wp7#comments</comments>
		<pubDate>Sun, 01 May 2011 19:46:57 +0000</pubDate>
		<dc:creator>Fox</dc:creator>
				<category><![CDATA[Miscelanea]]></category>
		<category><![CDATA[Windows Phone 7]]></category>

		<guid isPermaLink="false">http://blog.foxandxss.net/?p=522</guid>
		<description><![CDATA[Hola!!, hace una semana adquirí una cuenta de desarrollador de Windows Phone 7 (Bueno, también sirve para xbox360, pero no es lo mio). Espero adquirir pronto más conocimiento para ir subiendo mis aplicaciones (ya tengo un par de ideas, aunque más son siempre bienvenidas ). También espero coger ideas para ir escribiendo algunos artículos para [...]]]></description>
			<content:encoded><![CDATA[<p>Hola!!, hace una semana adquirí una cuenta de desarrollador de <strong>Windows Phone 7</strong> (Bueno, también sirve para xbox360, pero no es lo mio).</p>
<p>Espero adquirir pronto más conocimiento para ir subiendo mis aplicaciones (ya tengo un par de ideas, aunque más son siempre bienvenidas <img src='http://blog.foxandxss.net/wp-includes/images/smilies/icon_razz.gif' alt=':P' class='wp-smiley' /> ).</p>
<p>También espero coger ideas para ir escribiendo algunos artículos para todos vosotors (aquí tambien son bienvenidas las ideas <img src='http://blog.foxandxss.net/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> )</p>
<p>Así que nada, espero pronto traeros sorpresas <img src='http://blog.foxandxss.net/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
<p>Un saludo.</p>
<img src="http://feeds.feedburner.com/~r/ElBlogDeFox/~4/0_eASDjumks" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://blog.foxandxss.net/he-adquirido-una-cuenta-de-apphub-para-desarrollar-wp7/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		<feedburner:origLink>http://blog.foxandxss.net/he-adquirido-una-cuenta-de-apphub-para-desarrollar-wp7</feedburner:origLink></item>
		<item>
		<title>¡Herramientas de ASP.NET MVC 3 actualizadas!</title>
		<link>http://feedproxy.google.com/~r/ElBlogDeFox/~3/-Zspp4mVPDc/herramientas-de-asp-net-mvc-3-actualizadas</link>
		<comments>http://blog.foxandxss.net/herramientas-de-asp-net-mvc-3-actualizadas#comments</comments>
		<pubDate>Wed, 13 Apr 2011 14:53:50 +0000</pubDate>
		<dc:creator>Fox</dc:creator>
				<category><![CDATA[Articulos]]></category>
		<category><![CDATA[ASP.NET MVC 3]]></category>
		<category><![CDATA[MvcScaffolding]]></category>

		<guid isPermaLink="false">http://blog.foxandxss.net/?p=516</guid>
		<description><![CDATA[Por si no lo sabéis, en estos días se está celebrando el MIX11. En el MIX11 se celebran más de 100 charlas, casi una decena de Bootcamps y por supuesto los Keynotes donde los grandes nombres presentan lo nuevo del mundillo. En este post vamos a hablar sobre una de esas cosas nuevas, en concreto [...]]]></description>
			<content:encoded><![CDATA[<p>Por si no lo sabéis, en estos días se está celebrando el <a href="http://live.visitmix.com/">MIX11</a>. En el <b>MIX11</b> se celebran más de 100 charlas, casi una decena de <b>Bootcamps</b> y por supuesto los <b>Keynotes</b> donde los grandes nombres presentan lo nuevo del mundillo.</p>
<p>En este post vamos a hablar sobre una de esas cosas nuevas, en concreto de la actualización de las herramientas de <b>ASP.NET MVC 3</b>. Las podéis bajar de <a href="http://www.asp.net/mvc/mvc3">aquí</a>.</p>
<p>¿Qué trae de nuevo? Vamos paso por paso.<br />
<span id="more-516"></span><br />
Vamos a <b>Visual Studio</b> y le damos a crear una nueva <b>ASP.NET MVC 3 Web Application</b></p>
<p><a href="http://blog.foxandxss.net/cosasblog/mvc3update/1.png"><img alt="" src="http://blog.foxandxss.net/cosasblog/mvc3update/1.png" class="alignnone" width="674" height="608" /></a><br />
Como véis, tenemos una nueva opción, <b>Intranet Application</b>. Como su nombre indica, este tipo de aplicaciones están pensadas para funcionar en intranet, así que el sistema de autentificación será <b>Windows Authentication</b> en vez de <b>Forms Authentication</b> (Por lo cual se quitará el <i>AccountController</i>). Por lo demás es igual a <b>Internet Application</b>.</p>
<p>Si os seguís fijando, ahora <b>ASP.NET MVC 3</b>, <b>tiene soporte HTML 5</b>, lo cual es muy interesante. Vamos a crear una <b>Internet Application</b> con la opción de HTML 5 marcada.</p>
<p>Si váis al archivo <i>_Layout.cshtml</i> os podréis fijar que está usando los nuevos tags de <b>HTML 5</b>. Y no solo eso, además ahora las nuevas herramientas <b>trae por defecto <a href="http://www.modernizr.com/">Modernizr</a></b> que para quien no lo sepa es una librería en javascript que nos ayuda a usar las nuevas tecnologías como <b>HTML 5</b> y <b>CSS 3</b> a la vez que mantenemos compatibilidad con navegadores más antiguos.</p>
<p><a href="http://blog.foxandxss.net/cosasblog/mvc3update/2.png"><img alt="" src="http://blog.foxandxss.net/cosasblog/mvc3update/2.png" class="alignnone" width="696" height="533" /></a></p>
<p>Aparte de <b>Modernizr</b>, <b>ahora disponemos de Jquery 1.5</b> y no es eso lo más interesante, ahora <b>estas librerías vienen como paquetes de NuGet</b> lo que significa que cuando salga por ejemplo una nueva versión de jQuery o Modernizr, se actualizará en nuestra aplicación usando <b>NuGet</b> los que nos ahorra de quebraderos de cabeza (aunque por lado negativo, no actualiza las referencias en el Layout, aunque era previsible).</p>
<p>Ahora <b>ASP.NET MVC 3</b> trae por defecto <b>Entity Framework 4.1</b> lo cual nos ahorra un poco de tiempo <img src='http://blog.foxandxss.net/wp-includes/images/smilies/icon_razz.gif' alt=':P' class='wp-smiley' /> </p>
<p><a href="http://blog.foxandxss.net/cosasblog/mvc3update/3.png"><img alt="" src="http://blog.foxandxss.net/cosasblog/mvc3update/3.png" class="alignnone" width="398" height="147" /></a></p>
<p>¿Ejecutamos la aplicación? Venga:</p>
<p><a href="http://blog.foxandxss.net/cosasblog/mvc3update/4.png"><img alt="" src="http://blog.foxandxss.net/cosasblog/mvc3update/4.png" class="alignnone" width="549" height="306" /></a></p>
<p>¡Ahora el Layout usa HTML5! Bordes redondeados, título con sombra&#8230; mooola <img src='http://blog.foxandxss.net/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
<p>Ahora vamos con la última actualización, <b>scaffolding</b>. ¿Qué es eso? <b>Scaffolding</b> sirve para generar código que nos permita crear, leer, actualizar y borrar entradas en una base de datos, vaya, nos genera código <i>CRUD</i>. Quizás te hayas dado cuenta que ya podíamos generar código para una de estas cosas cuando creabamos una vista, pero ahora podemos generar directamente un controlador con el código necesario para hacer todas estas cosas con sus respectivas vistas y todo.</p>
<p>¿Vemos como funciona esta mágia? <img src='http://blog.foxandxss.net/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
<p>Vamos a crear una clase, algo simple:</p>
<pre class="brush: csharp;">
namespace MVC3Update.Models
{
    public class Persona
    {
        public int ID { get; set; }
        public string Nombre { get; set; }
        public int Edad { get; set; }
        public string Email { get; set; }
    }
}
</pre>
<p>Aquí la tan socorrida clase persona <img src='http://blog.foxandxss.net/wp-includes/images/smilies/icon_razz.gif' alt=':P' class='wp-smiley' /> </p>
<p>¿Qué vamos a usar de base de datos? ¿SQL Server CE 4? Pues vamos a instalarlo con NuGet:</p>
<pre class="brush: plain;">
PM&gt; install-package EntityFramework.SqlServerCompact
</pre>
<p>Compilamos la aplicación y vamos ahora con el controlador:</p>
<p><a href="http://blog.foxandxss.net/cosasblog/mvc3update/5.png"><img alt="" src="http://blog.foxandxss.net/cosasblog/mvc3update/5.png" class="alignnone" width="604" height="393" /></a></p>
<p>Uh uh, opciones nuevas. Aquí le decimos que queremos un controlador con las acciones para leer/escribir, sus respectivas vistas y esto usando EntityFramework. Además especificamos la clase con la que trabajará y en la clase para contexto le damos a añadir una nueva, le ponemos <i>PersonasContext</i> y la creará por nosotros.</p>
<p>Antes de ver los detalles, vamos a ejecutar la aplicación y nos vamos al controlador <i>Personas</i>, nos aparecerá el listado:</p>
<p><a href="http://blog.foxandxss.net/cosasblog/mvc3update/6.png"><img alt="" src="http://blog.foxandxss.net/cosasblog/mvc3update/6.png" class="alignnone" width="545" height="336" /></a></p>
<p>Clicamos en crear nuevo y nos aparece una vista para crear nueva <i>Persona</i></p>
<p><a href="http://blog.foxandxss.net/cosasblog/mvc3update/7.png"><img alt="" src="http://blog.foxandxss.net/cosasblog/mvc3update/7.png" class="alignnone" width="534" height="593" /></a></p>
<p>Metemos algunos datos, le damos a añadir y ¡Voila!, los datos están añadidos:</p>
<p><a href="http://blog.foxandxss.net/cosasblog/mvc3update/8.png"><img alt="" src="http://blog.foxandxss.net/cosasblog/mvc3update/8.png" class="alignnone" width="540" height="369" /></a></p>
<p>¿Una maravilla verdad? Puedes incluso ver que la base de datos se ha creado y tal.</p>
<p>Si le echamos un ojo al controlador, vemos que nos ha creado todo el CRUD y con todo el código necesario para funcionar:</p>
<pre class="brush: csharp;">
using System;
using System.Collections.Generic;
using System.Data;
using System.Data.Entity;
using System.Linq;
using System.Web;
using System.Web.Mvc;
using MVC3Update.Models;

namespace MVC3Update.Controllers
{
    public class PersonasController : Controller
    {
        private PersonasContext db = new PersonasContext();

        //
        // GET: /Personas/

        public ViewResult Index()
        {
            return View(db.Personas.ToList());
        }

        //
        // GET: /Personas/Details/5

        public ViewResult Details(int id)
        {
            Persona persona = db.Personas.Find(id);
            return View(persona);
        }

        //
        // GET: /Personas/Create

        public ActionResult Create()
        {
            return View();
        } 

        //
        // POST: /Personas/Create

        [HttpPost]
        public ActionResult Create(Persona persona)
        {
            if (ModelState.IsValid)
            {
                db.Personas.Add(persona);
                db.SaveChanges();
                return RedirectToAction(&quot;Index&quot;);
            }

            return View(persona);
        }

        //
        // GET: /Personas/Edit/5

        public ActionResult Edit(int id)
        {
            Persona persona = db.Personas.Find(id);
            return View(persona);
        }

        //
        // POST: /Personas/Edit/5

        [HttpPost]
        public ActionResult Edit(Persona persona)
        {
            if (ModelState.IsValid)
            {
                db.Entry(persona).State = EntityState.Modified;
                db.SaveChanges();
                return RedirectToAction(&quot;Index&quot;);
            }
            return View(persona);
        }

        //
        // GET: /Personas/Delete/5

        public ActionResult Delete(int id)
        {
            Persona persona = db.Personas.Find(id);
            return View(persona);
        }

        //
        // POST: /Personas/Delete/5

        [HttpPost, ActionName(&quot;Delete&quot;)]
        public ActionResult DeleteConfirmed(int id)
        {
            Persona persona = db.Personas.Find(id);
            db.Personas.Remove(persona);
            db.SaveChanges();
            return RedirectToAction(&quot;Index&quot;);
        }

        protected override void Dispose(bool disposing)
        {
            db.Dispose();
            base.Dispose(disposing);
        }
    }
}
</pre>
<p>No le falta detalle, pero ninguno ninguno.</p>
<p>No solo nos ha generado ese código, también nos ha creado las vistas con el código necesario para trabajar y todo:</p>
<p><a href="http://blog.foxandxss.net/cosasblog/mvc3update/9.png"><img alt="" src="http://blog.foxandxss.net/cosasblog/mvc3update/9.png" class="alignnone" width="210" height="215" /></a></p>
<p>Por si fuera poco, podemos instalar algún paquete NuGet para ampliar las posibilidades de scaffolding a la hora de crear un controlador. Por ejemplo, podemos instalar el maravilloso <a href="http://mvcscaffolding.codeplex.com/">MvcScaffolding</a> que tiene muchísimas más opciones, es personalizable, nos permite crear nuestros propios plugins&#8230; Por defecto podemos generar un controlador con CRUD contra un EntityFramework e incluso generar un controlador que usará un <a href="http://blog.foxandxss.net/index.php/patron-repository/">repositorio</a> el cual generará también por supuesto. Si trabajamos con NHibernate por ejemplo podremos crear un plugin que genere código contra NHibernate o lo que queramos vaya&#8230;</p>
<p>En resumen, la actualización de las herramientas de <b>ASP.NET MVC 3</b> nos trae:</p>
<ul>
<li>Soporte para crear aplicaciones para intranet</li>
<li>La posibilidad de usar HTML5 en nuestras aplicaciones</li>
<li>Trae por defecto jQuery 1.5.1 y Modernizr, ambos como paquetes de NuGet</li>
<li>El dialogo de crear controlador ha sido ampliado para soportar scaffolding</li>
<li>Podemos usar nuestra propia librería de scaffolding en el anteriormente citado diálogo</li>
<li>Entity Framework 4.1 incluido de serie</li>
</ul>
<p>Una simple actualización, y qué de maravillas&#8230;</p>
<p>Hasta otra <img src='http://blog.foxandxss.net/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
<img src="http://feeds.feedburner.com/~r/ElBlogDeFox/~4/-Zspp4mVPDc" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://blog.foxandxss.net/herramientas-de-asp-net-mvc-3-actualizadas/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		<feedburner:origLink>http://blog.foxandxss.net/herramientas-de-asp-net-mvc-3-actualizadas</feedburner:origLink></item>
		<item>
		<title>Dependency Injection: ASP.NET MVC 3 + Ninject</title>
		<link>http://feedproxy.google.com/~r/ElBlogDeFox/~3/a25WDJUT_Rk/dependency-injection-asp-net-mvc-3-ninject</link>
		<comments>http://blog.foxandxss.net/dependency-injection-asp-net-mvc-3-ninject#comments</comments>
		<pubDate>Thu, 07 Apr 2011 14:51:08 +0000</pubDate>
		<dc:creator>Fox</dc:creator>
				<category><![CDATA[Articulos]]></category>
		<category><![CDATA[ASP.NET MVC 3]]></category>
		<category><![CDATA[Dependency Injection]]></category>
		<category><![CDATA[Ninject]]></category>

		<guid isPermaLink="false">http://blog.foxandxss.net/?p=513</guid>
		<description><![CDATA[Vamos con el tercer y último artículo sobre Dependency Injection. Ésta vez vamos a usar como ejemplo ASP.NET MVC 3. Ésta vez vamos a usar otra librería, en este caso vamos a probar con Ninject. Ninject es una de las muchas alternativas que hay para implementar Dependency Injection y para mi gusto es de las [...]]]></description>
			<content:encoded><![CDATA[<p>Vamos con el tercer y último artículo sobre <b>Dependency Injection</b>.</p>
<p>Ésta vez vamos a usar como ejemplo <b>ASP.NET MVC 3</b>. Ésta vez vamos a usar otra librería, en este caso vamos a probar con <b>Ninject</b>.</p>
<p><b>Ninject</b> es una de las muchas alternativas que hay para implementar <b>Dependency Injection</b> y para mi gusto es de las mejores para <b>ASP.NET MVC</b>.<br />
<span id="more-513"></span><br />
Vamos a empezar creando la aplicación, la llamaremos <i>MVCWithDI</i>, crearemos una <i>Aplicacion de internet</i> pues ya nos ofrece un <i>Layout</i> básico.</p>
<p>Implementaremos la misma idea que en el artículo anterior:</p>
<p>Creamos una clase llamada <i>Persona</i>:</p>
<pre class="brush: csharp;">
namespace MVCWithDI.Models
{
    public class Persona
    {
        public string Nombre { get; set; }
        public int Edad { get; set; }
    }
}
</pre>
<p>Y ahora creamos las interfaces de los servicios que vamos a usar:</p>
<pre class="brush: csharp;">
namespace MVCWithDI.Abstract
{
    public interface IFechaAEdad
    {
        int Conversion(string fecha);
    }
}
</pre>
<pre class="brush: csharp;">
namespace MVCWithDI.Abstract
{
    public interface ICapitalizador
    {
        string Capitalizar(string nombre);
    }
}
</pre>
<p>Ahora implementamos estos servicios:</p>
<pre class="brush: csharp;">
using System;
using MVCWithDI.Abstract;

namespace MVCWithDI.Concrete
{
    public class FechaAEdad : IFechaAEdad
    {
        public int Conversion(string fecha)
        {
            int edad;
            var partesfecha = fecha.Split('/');

            // Añadimos el año
            edad = DateTime.Now.Year - Int32.Parse(partesfecha[2]);

            // Comprobamos si hemos cumplido ya este año o no
            if (Int32.Parse(partesfecha[1]) &lt; DateTime.Now.Month) // todavia no hemos cumplido
                edad -= 1; // le restamos un año pues
            if (Int32.Parse(partesfecha[1]) == DateTime.Now.Month)
                if (Int32.Parse(partesfecha[0]) &gt; DateTime.Now.Day) // no ha llegado el dia
                    edad -= 1;

            return edad;
        }
    }
}
</pre>
<pre class="brush: csharp;">
using MVCWithDI.Abstract;

namespace MVCWithDI.Concrete
{
    public class Capitalizador : ICapitalizador
    {
        public string Capitalizar(string nombre)
        {
            string nombreCapitalizado = string.Empty;

            var trozoNombre = nombre.Split();

            foreach (var trozo in trozoNombre)
            {
                nombreCapitalizado += char.ToUpper(trozo[0]) + trozo.Substring(1) + &quot; &quot;;
            }

            return nombreCapitalizado.TrimEnd();
        }
    }
}
</pre>
<p>Ya tenemos los servicios implementados.</p>
<p>Vamos a crear un constructor en el controlador <i>Home</i> y agregar unas referencias:</p>
<pre class="brush: csharp;">
private readonly IFechaAEdad _fechaAEdad;
private readonly ICapitalizador _capitalizador;

public HomeController(IFechaAEdad fechaAEdad, ICapitalizador capitalizador)
{
	_fechaAEdad = fechaAEdad;
	_capitalizador = capitalizador;
}
</pre>
<p>Simplemente el constructor recibe un par de referencias de los servicios que usará, al igual que se hizo con el <b>ViewModel</b> en <b>WPF</b></p>
<p>Ahora vamos a actualizar el método <i>Index</i>:</p>
<p>public ActionResult Index()<br />
{<br />
	return View();<br />
}</p>
<p>Simplemente muestra la vista. Vamos a editar ahora la vista (viene creada con el proyecto):</p>
<pre class="brush: xml;">
@{
    ViewBag.Title = &quot;ASP.NET MVC 3 con Ninject&quot;;
}

@using (Html.BeginForm())
{
    @Html.Label(&quot;Nombre y Apellido&quot;)
    @Html.TextBox(&quot;nombre&quot;)
    @Html.Label(&quot;Fecha de nacimiento (dd/mm/yyyy)&quot;)
    @Html.TextBox(&quot;fecha&quot;)
    &lt;input type=&quot;submit&quot; value=&quot;Dale&quot; /&gt;
}
</pre>
<p><a href="http://blog.foxandxss.net/cosasblog/dependencyinjection/mvc/1.png"><img alt="" src="http://blog.foxandxss.net/cosasblog/dependencyinjection/mvc/1.png" class="alignnone" width="277" height="265" /></a></p>
<p>Un simple formulario para recoger los datos. Este formulario hará <i>POST</i> en la misma acción <i>Index</i> así que vamos a crear una acción <i>Index</i> solo para peticiones <i>POST</i> que maneje los datos del formulario:</p>
<pre class="brush: csharp;">
[HttpPost]
public ActionResult Index(string nombre, string fecha)
{
	var persona = new Persona
						{
							Nombre = _capitalizador.Capitalizar(nombre),
							Edad = _fechaAEdad.Conversion(fecha)
						};
	return RedirectToAction(&quot;MostrarPersona&quot;, persona);
}
</pre>
<p>Algo simple, del formulario recibe esos dos parametros, los pasamos a sus respectivos servicios y creamos un objeto <i>Persona</i> con esa información.</p>
<p>Ésta acción nos redirige a otra acción, en este caso una llamada <i>MostrarPersona</i>, al cual le pasamos el objeto creado:</p>
<pre class="brush: csharp;">
public ActionResult MostrarPersona(Persona persona)
{
	return View(persona);
}
</pre>
<p>Ésta acción simplemente nos muestra una vista a la cual le pasamos el objeto <i>persona</i>.</p>
<p>Bien, vamos a crear esta vista, las opciones quedarán así:</p>
<p><a href="http://blog.foxandxss.net/cosasblog/dependencyinjection/mvc/2.png"><img alt="" src="http://blog.foxandxss.net/cosasblog/dependencyinjection/mvc/2.png" class="alignnone" width="511" height="504" /></a></p>
<p>Al poner lo de <i>Details</i> ya nos creará una vista en la cual nos mostrará los datos de la persona, justo lo que necesitamos.</p>
<p>Ya tenemos la aplicación implementada. Ahora necesitamos implementar el <b>Dependency Injection</b> para que funcione.</p>
<p><b>ASP.NET MVC 3</b> soporta <b>Dependency Injection</b> sin tener que hacer malabares ni nada extra, ya que antiguamente necesitabamos implementar muchas cosas por nuestra cuenta.</p>
<p>Ahora, simplemente tendremos que implementar <i>IDependencyResolver</i> y pasar esa implementación al framework, veremos como:</p>
<p>Para empezar, necesitamos <b>Ninject</b> bien lo bajas de su web o más comodamente usamos <b>NuGet</b></p>
<pre class="brush: plain;">
PM&gt; install-package Ninject
</pre>
<p>Ya que tenemos Ninject, vamos a implementar <i>IDependencyResolver</i>:</p>
<pre class="brush: csharp;">
using System;
using System.Collections.Generic;
using System.Web.Mvc;
using Ninject;

namespace MVCWithDI.Infrastructure
{
    public class NinjectDependencyResolver : IDependencyResolver
    {
        private readonly IKernel _kernel;

        public NinjectDependencyResolver(IKernel kernel)
        {
            _kernel = kernel;
        }

        public object GetService(Type serviceType)
        {
            return _kernel.TryGet(serviceType);
        }

        public IEnumerable&lt;object&gt; GetServices(Type serviceType)
        {
            return _kernel.GetAll(serviceType);
        }
    }
}
</pre>
<p><i>IDependencyResolver</i> tiene dos métodos. Con <i>GetService</i> devolvemos el servicio que necesitamos y con <i>GetServices</i> recogemos una colección de dicho servicio.</p>
<p>Nuestra implementación recibe una instancia de <i>IKernel</i>. En <b>Ninject</b> el <i>IKernel</i> es nuestro contenedor, en el cual iremos enlanzado nuestros servicios.</p>
<p>Vale, entonces necesitamos crear dicho contenedor y enlazar nuestros servicios, así que vamos a ello:</p>
<pre class="brush: csharp;">
using System.Web.Mvc;
using MVCWithDI.Abstract;
using MVCWithDI.Concrete;
using Ninject;

namespace MVCWithDI.Infrastructure
{
    public class NinjectKernelSetup
    {
        public static void Setup()
        {
            var kernel = new StandardKernel();

            kernel.Bind&lt;ICapitalizador&gt;().To&lt;Capitalizador&gt;();
            kernel.Bind&lt;IFechaAEdad&gt;().To&lt;FechaAEdad&gt;();

            DependencyResolver.SetResolver(new NinjectDependencyResolver(kernel));
        }
    }
}
</pre>
<p>No es nada complicado, ni explicación requiere. A excepción de la última linea. Ahí es donde le decimos al framework que nuestro sistema de <b>Dependency Injection</b> va a ser manejado por <b>Ninject</b> (pasandole la clase que creamos implementando <i>IDependencyResolver</i>).</p>
<p>Por último, necesitamos unir este código con nuestra aplicación, para ello nos vamos al fichero <i>Global.asax.cs</i> y en el método <i>Application_Start</i> insertamos una nueva linea:</p>
<pre class="brush: csharp;">
protected void Application_Start()
{
	AreaRegistration.RegisterAllAreas();

	RegisterGlobalFilters(GlobalFilters.Filters);
	RegisterRoutes(RouteTable.Routes);

	NinjectKernelSetup.Setup();
}
</pre>
<p>Ahora ejecutamos la aplicación, insertamos nuestros datos y el resultado será similar a este:</p>
<p><a href="http://blog.foxandxss.net/cosasblog/dependencyinjection/mvc/3.png"><img alt="" src="http://blog.foxandxss.net/cosasblog/dependencyinjection/mvc/3.png" class="alignnone" width="259" height="370" /></a></p>
<p>¿Fácil verdad? <img src='http://blog.foxandxss.net/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
<img src="http://feeds.feedburner.com/~r/ElBlogDeFox/~4/a25WDJUT_Rk" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://blog.foxandxss.net/dependency-injection-asp-net-mvc-3-ninject/feed</wfw:commentRss>
		<slash:comments>1</slash:comments>
		<feedburner:origLink>http://blog.foxandxss.net/dependency-injection-asp-net-mvc-3-ninject</feedburner:origLink></item>
		<item>
		<title>Dependency Injection: MVVM Light + WPF + Unity</title>
		<link>http://feedproxy.google.com/~r/ElBlogDeFox/~3/UTRX16xkROY/dependency-injection-mvvm-light-wpf-unity</link>
		<comments>http://blog.foxandxss.net/dependency-injection-mvvm-light-wpf-unity#comments</comments>
		<pubDate>Thu, 17 Feb 2011 18:27:13 +0000</pubDate>
		<dc:creator>Fox</dc:creator>
				<category><![CDATA[Articulos]]></category>
		<category><![CDATA[Dependency Injection]]></category>
		<category><![CDATA[MVVM]]></category>
		<category><![CDATA[unity]]></category>
		<category><![CDATA[WPF]]></category>

		<guid isPermaLink="false">http://blog.foxandxss.net/?p=503</guid>
		<description><![CDATA[Bueno, ya sabéis qué es Dependency Injection y para qué puede sernos útil. Ahora bien&#8230; ¿Como implementamos eso en WPF y MVVM Light? Faacil faacil. Para este ejemplo vamos a usar Unity que es una de las muchas librerías para Dependency Injection. Vamos a ello: Creamos una nueva aplicación usando la plantilla de MVVM Light, [...]]]></description>
			<content:encoded><![CDATA[<p>Bueno, ya sabéis qué es <b>Dependency Injection</b> y para qué puede sernos útil.</p>
<p>Ahora bien&#8230; ¿Como implementamos eso en <b>WPF</b> y <b>MVVM Light</b>?</p>
<p>Faacil faacil. Para este ejemplo vamos a usar <b>Unity</b> que es una de las muchas librerías para <b>Dependency Injection</b>.</p>
<p>Vamos a ello:<br />
<span id="more-503"></span><br />
Creamos una nueva aplicación usando la plantilla de <b>MVVM Light</b>, la llamaremos <i>MVVMWithDI</i>.</p>
<p>Vamos a cambiar nuestra ventana <i>MainWindow.xaml</i> por algo simple creado rápidamente en <b>Blend</b>:</p>
<pre class="brush: xml;">
&lt;Window
        xmlns=&quot;http://schemas.microsoft.com/winfx/2006/xaml/presentation&quot;
        xmlns:x=&quot;http://schemas.microsoft.com/winfx/2006/xaml&quot;
        xmlns:d=&quot;http://schemas.microsoft.com/expression/blend/2008&quot; xmlns:mc=&quot;http://schemas.openxmlformats.org/markup-compatibility/2006&quot; mc:Ignorable=&quot;d&quot; x:Class=&quot;MVVMWithDI.MainWindow&quot;
        Title=&quot;MVVM Con DI&quot;
        Height=&quot;304&quot;
        Width=&quot;260&quot;
        Background=&quot;#FFDAFEFF&quot;&gt;

	&lt;Window.DataContext&gt;
		&lt;Binding Path=&quot;Main&quot; Source=&quot;{StaticResource Locator}&quot;/&gt;
	&lt;/Window.DataContext&gt;

    &lt;Grid x:Name=&quot;LayoutRoot&quot;&gt;

        &lt;Label Content=&quot;Nombre y apellido:&quot; HorizontalAlignment=&quot;Left&quot; Margin=&quot;8,24,0,0&quot; VerticalAlignment=&quot;Top&quot;/&gt;
        &lt;TextBox Height=&quot;26.04&quot; Margin=&quot;8,53.96,19,0&quot; TextWrapping=&quot;Wrap&quot; VerticalAlignment=&quot;Top&quot; Text=&quot;{Binding Nombre}&quot;/&gt;
        &lt;Label Content=&quot;Fecha nacimiento (dd/mm/yyyy):&quot; Margin=&quot;8,89,46,0&quot; VerticalAlignment=&quot;Top&quot; d:LayoutOverrides=&quot;Width&quot;/&gt;
        &lt;TextBox Margin=&quot;8,118.96,19,121&quot; TextWrapping=&quot;Wrap&quot; Text=&quot;{Binding FechaNacimiento}&quot;/&gt;
        &lt;Button Content=&quot;Dale&quot; Height=&quot;28&quot; Margin=&quot;0,0,19,83.942&quot; VerticalAlignment=&quot;Bottom&quot; HorizontalAlignment=&quot;Right&quot; Width=&quot;69&quot; Command=&quot;{Binding DaleCommand}&quot;/&gt;
        &lt;TextBlock Margin=&quot;8,0,19,12&quot; TextWrapping=&quot;Wrap&quot; VerticalAlignment=&quot;Bottom&quot; Height=&quot;39&quot; FontWeight=&quot;Bold&quot; Foreground=&quot;#FF0048D6&quot; Text=&quot;{Binding Saludo}&quot;/&gt;

    &lt;/Grid&gt;
&lt;/Window&gt;
</pre>
<p><a href="http://blog.foxandxss.net/cosasblog/dependencyinjection/wpf/1.png"><img alt="" src="http://blog.foxandxss.net/cosasblog/dependencyinjection/wpf/1.png" class="alignnone" width="260" height="304" /></a></p>
<p>Nada complejo, lo justo y necesario para implementar <b>Dependency Injection</b>.</p>
<p>Empezamos con una clase <i>Persona</i> que aloje nuestro objeto:</p>
<pre class="brush: csharp;">
namespace MVVMWithDI.Model
{
    public class Persona
    {
        public string Nombre { get; set; }
        public int Edad { get; set; }
    }
}
</pre>
<p>Ahora necesitaremos 2 servicios, uno que nos pase de &#8220;Fecha nacimiento => Edad&#8221; y otro que nos capitalice el nombre.</p>
<p>Como ya sabéis, todos los servicios que creemos serán interfaces, las cuales serán luego implementadas por los servicios concretos.</p>
<p>El conversor:</p>
<pre class="brush: csharp;">
namespace MVVMWithDI.Abstract
{
    public interface IFechaAEdad
    {
        int Conversion(string fecha);
    }
}
</pre>
<p>El &#8220;capitalizador&#8221;</p>
<pre class="brush: csharp;">
namespace MVVMWithDI.Abstract
{
    public interface ICapitalizador
    {
        string Capitalizar(string nombre);
    }
}
</pre>
<p>Vale, ya tenemos las interfaces, vamos con las implementaciones de esos servicios:</p>
<pre class="brush: csharp;">
namespace MVVMWithDI.Concrete
{
    public class FechaAEdad : IFechaAEdad
    {
        public int Conversion(string fecha)
        {
            int edad;
            var partesfecha = fecha.Split('/');

            // Añadimos el año
            edad = DateTime.Now.Year - Int32.Parse(partesfecha[2]);

            // Comprobamos si hemos cumplido ya este año o no
            if (Int32.Parse(partesfecha[1]) &lt; DateTime.Now.Month) // todavia no hemos cumplido
                edad -= 1; // le restamos un año pues
            if (Int32.Parse(partesfecha[1]) == DateTime.Now.Month)
                if (Int32.Parse(partesfecha[0]) &gt; DateTime.Now.Day) // no ha llegado el dia
                    edad -= 1;

            return edad;
        }
    }
}
</pre>
<p>Algo simple, no vamos a marearnos en comprobar la entrada para simplificar el artículo.</p>
<p>Vamos con la implementación de la clase que capitaliza</p>
<pre class="brush: csharp;">
namespace MVVMWithDI.Concrete
{
    public class Capitalizador : ICapitalizador
    {
        public string Capitalizar(string nombre)
        {
            string nombreCapitalizado = string.Empty;

            var trozoNombre = nombre.Split();

            foreach (var trozo in trozoNombre)
            {
                nombreCapitalizado += char.ToUpper(trozo[0]) + trozo.Substring(1) + &quot; &quot;;
            }

            return nombreCapitalizado.TrimEnd();
        }
    }
}
</pre>
<p>Otra clase simple.</p>
<p>Ahora toca implementar el <i>MainViewModel</i></p>
<p>Empecemos con este código:</p>
<pre class="brush: csharp;">
public class MainViewModel : ViewModelBase
{
	private readonly IFechaAEdad _fechaAEdad;
	private readonly ICapitalizador _capitalizador;

	public MainViewModel(IFechaAEdad fechaAEdad, ICapitalizador capitalizador)
	{
		_fechaAEdad = fechaAEdad;
		_capitalizador = capitalizador;
	}
}
</pre>
<p>Si recordás el artículo anterior, si un <i>ViewModel</i> (y cualquier clase en verdad) va a hacer uso de algún servicio, tenemos que crear un constructor el cual reciba las implementaciones de dichos servicios y lo indicamos colocando las interfaces que dichos servicios han de implementar. Nada dificil.</p>
<p>Í‰ste sería el código del viewModel completo:</p>
<pre class="brush: csharp;">
    public class MainViewModel : ViewModelBase
    {
        private readonly IFechaAEdad _fechaAEdad;
        private readonly ICapitalizador _capitalizador;
        private string _nombre;
        private string _fechaNacimiento;
        private string _saludo;

        public RelayCommand DaleCommand { get; set; }

        public MainViewModel(IFechaAEdad fechaAEdad, ICapitalizador capitalizador)
        {
            _fechaAEdad = fechaAEdad;
            _capitalizador = capitalizador;

            DaleCommand = new RelayCommand(Dale);
        }

        public string Nombre
        {
            get { return _nombre; }
            set
            {
                _nombre = value;
                RaisePropertyChanged(&quot;Nombre&quot;);
            }
        }

        public string FechaNacimiento
        {
            get { return _fechaNacimiento; }
            set
            {
                _fechaNacimiento = value;
                RaisePropertyChanged(&quot;FechaNacimiento&quot;);
            }
        }

        public string Saludo
        {
            get { return _saludo; }
            set
            {
                _saludo = value;
                RaisePropertyChanged(&quot;Saludo&quot;);
            }
        }

        private void Dale()
        {
            var nombre = _capitalizador.Capitalizar(Nombre);
            var edad = _fechaAEdad.Conversion(FechaNacimiento);

            var persona = new Persona
                              {
                                  Nombre = nombre,
                                  Edad = edad
                              };
            Saludo = string.Format(&quot;Hola soy {0} y tengo {1} años&quot;, persona.Nombre, persona.Edad);
        }
    }
}
</pre>
<p>Fijaros como <i>Dale</i> hace uso de los servicios pero en ningun momento está el <i>ViewModel</i> acoplado a ninguno de esos dos servicios.</p>
<p>Si intentaramos compilar ahora el programa obtendríamos un error:</p>
<pre class="brush: plain;">
'MVVMWithDI.ViewModel.MainViewModel'
</pre>
<p>Normal&#8230; el <i>ViewModelLocator</i> está creando las instancias de los <i>ViewModel</i> sin proporcionar ningún argumento&#8230; Entonces, ¿Qué necesitamos? Necesitamos un contenedor que nos provea de las implementaciones que el <i>ViewModel</i> (o cualquier clase) nos pida. Para este programa vamos a usar <b>Unity</b> y como siempre usaremos <b>NuGet</b> para ello:</p>
<pre class="brush: plain;">
install-package Unity
</pre>
<p>Vale, ya tenemos <b>Unity</b>, ahora lo que necesitamos crear es una clase que comunmente se suele nombrar <i>Bootstrapper</i> y colocar ahí todo el código que necesitamos para echar a andar <b>Unity</b>:</p>
<pre class="brush: csharp;">
namespace MVVMWithDI
{
    public class Bootstrapper
    {
        public IUnityContainer Container { get; set; }

        public Bootstrapper()
        {
            Container = new UnityContainer();

            ConfigureContainer();
        }

        private void ConfigureContainer()
        {
            Container.RegisterType&lt;IFechaAEdad, FechaAEdad&gt;();
            Container.RegisterInstance&lt;ICapitalizador&gt;(new Capitalizador());
            Container.RegisterType&lt;MainViewModel&gt;();
        }
    }
}
</pre>
<p>Una clase muy sencillita. Creamos un objeto del tipo <i>IUnityContainer</i> que para que nos entendamos, es el alma de la fiesta aquí. El contenedor es donde registramos todas las interfaces con sus respectivas implementaciones o simplemente registramos una clase que use servicios para que la autoresuelva el contenedor por si solo.</p>
<p>Por pasos:</p>
<p>Podemos registrar tipos usando <i>RegisterType</i> como véis con el caso de <i>IFechaAEdad</i>. Simplemente le indicamos la interfaz y la implementación concreta a usar.<br />
También podemos registrar una instancia en vez del tipo directamente, como en el caso de <i>ICapitalizador</i> que estamos registrando una instancia en vez del tipo en sí. Esto es útil cuando el tipo tiene un constructor con parámetros, así podemos crear la instancia de antemano y luego meterla en el contenedor. En este caso sería mejor usar la otra forma, pero aquí estamos para enseñar maneras <img src='http://blog.foxandxss.net/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /><br />
Por último, podemos registrar directamente un tipo, en este caso estamos registrando el <i>ViewModel</i>. Lo hacemos por comodidad, pues si no lo hicieramos tendriamos que, por cada parámetro que recibe dicho <i>ViewModel</i> llamar al contenedor y decirle que nos provea de una implementación de dicho parámetro.</p>
<p>Vale, ya tenemos <b>Unity</b> funcionando bien, ahora solo necesitamos un sitio donde podamos instanciar el <i>Bootstrapper</i>, en este caso nos va bien en el <i>ViewModelLocator</i>.</p>
<p>Para empezar vamos a borrar la clase entera y vamos a reimplementarla de una manera más sencilla:</p>
<pre class="brush: csharp;">
public class ViewModelLocator
{
	private static Bootstrapper _bootStrapper;

	static ViewModelLocator()
	{
		if (_bootStrapper == null)
			_bootStrapper = new Bootstrapper();
	}

	public MainViewModel Main
	{
		get { return _bootStrapper.Container.Resolve&lt;MainViewModel&gt;(); }
	}
}
</pre>
<p>Mucho más simple, ¿Verdad? Aquí estamos instanciando el <i>Bootstrapper</i> en el constructor, y cada vez que pidamos el <i>MainViewModel</i>, el contenedor de <b>Unity</b> lo resolverá y eso incluye los servicios que necesita para funcionar.</p>
<p>Por último tenemos que borrar una linea de <i>MainWindow.xaml.cs</i>:</p>
<pre class="brush: csharp;">
Closing += (s, e) =&gt; ViewModelLocator.Cleanup();
</pre>
<p>La eliminamos pues ya no estamos haciendo uso de ese método del <i>ViewModelLocator</i></p>
<p><a href="http://blog.foxandxss.net/cosasblog/dependencyinjection/wpf/2.png"><img alt="" src="http://blog.foxandxss.net/cosasblog/dependencyinjection/wpf/2.png" class="alignnone" width="260" height="304" /></a></p>
<p>Pues nada, ya está, en resumen:</p>
<p>Creamos las interfaces de nuestros servicios, las implementaciones de dichos servicios.<br />
Si una clase va a usar esos servicios, pasamos las interfaces como parámetros en el constructor.<br />
Registramos todos los servicios en el contenedor de nuestra libreria de elección.<br />
Finalmente ejecutamos el motor de <b>Unity</b> para que todo funcione.</p>
<p>Si mañana decidimos por ejemplo cambiar la clase que capitaliza los nombres por una más avanzada (no sé, que compruebe los nombres en una base de datos y añada también tildes si hace falta) solo tendremos que ir al contenedor de <b>Unity</b> y cambiar la implementación de <i>ICapitalizador</i> por la nueva clase que hemos creado. Todo seguirá funcionando perfectamente sin tener que cambiar ninguna linea de codigo más.</p>
<p><a href="http://blog.foxandxss.net/cosasblog/dependencyinjection/wpf/mvvmwithdi.rar">Aquí</a> te dejo el código fuente.</p>
<p>Hasta otra.</p>
<img src="http://feeds.feedburner.com/~r/ElBlogDeFox/~4/UTRX16xkROY" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://blog.foxandxss.net/dependency-injection-mvvm-light-wpf-unity/feed</wfw:commentRss>
		<slash:comments>2</slash:comments>
		<feedburner:origLink>http://blog.foxandxss.net/dependency-injection-mvvm-light-wpf-unity</feedburner:origLink></item>
		<item>
		<title>Dependency Injection: ¿Por qué?</title>
		<link>http://feedproxy.google.com/~r/ElBlogDeFox/~3/IbzCu2DOfpo/dependency-injection-por-que</link>
		<comments>http://blog.foxandxss.net/dependency-injection-por-que#comments</comments>
		<pubDate>Sun, 13 Feb 2011 12:11:58 +0000</pubDate>
		<dc:creator>Fox</dc:creator>
				<category><![CDATA[Articulos]]></category>
		<category><![CDATA[Dependency Injection]]></category>

		<guid isPermaLink="false">http://blog.foxandxss.net/?p=497</guid>
		<description><![CDATA[Vamos a empezar esta nueva serie de artículos con una sencilla pregunta: ¿Por qué? ¿Por qué es bueno usar Dependency Injection en mi aplicación? Vamos a poner un ejemplo imaginario de una clase: public class MiClase { private MiRepositorio _repo; private UnServicio _servicio; public Cliente ManejarCliente(int id) { _repo = new MiRepositorio(); _servicio = new [...]]]></description>
			<content:encoded><![CDATA[<p>Vamos a empezar esta nueva serie de artículos con una sencilla pregunta:</p>
<p>¿Por qué? ¿Por qué es bueno usar <b>Dependency Injection</b> en mi aplicación?</p>
<p>Vamos a poner un ejemplo imaginario de una clase:<br />
<span id="more-497"></span></p>
<pre class="brush: csharp;">
public class MiClase
{
	private MiRepositorio _repo;
	private UnServicio _servicio;

	public Cliente ManejarCliente(int id)
	{
		_repo = new MiRepositorio();
		_servicio = new UnServicio();

		var cliente = _repo.BuscarCliente(id);
		cliente.Tipo = _servicio.AsignarTipoCliente();

		return cliente;
	}
}
</pre>
<p>Una clase como otra cualquiera&#8230; Tiene un método que devuelve un cliente dado un <i>id</i>. Ese cliente lo sacamos de un repositorio y luego le asignamos un <i>Tipo</i> de cliente usando un servicio pensado para ello.</p>
<p>¿Fácil verdad? Es un trozo de código para nada anormal.</p>
<p>Ahora bien, ¿Recordás vuestras clases sobre <i>Programación orientada a objetos</i>? ¿Qué decian? Ah si, que las clases tienen que estar lo más desacopladas posibles entre si.</p>
<p>En este caso, la clase <i>MiClase</i> está acoplada con 2 clases más: <i>MiRepositorio</i> y <i>UnServicio</i> y ya sabemos qué conlleva eso&#8230;. Si algún dia queremos cambiar el servicio o el repositorio para pasar de una base de datos a algo más sencillito como un xml, pues tendríamos que ir cambiando las referencias en mil lados.</p>
<p>No solo está ahí el problema&#8230; ¿Qué pasaría si quisieramos hacer <b>Unit Test</b>? Pues lloraríamos directamente&#8230; ¿Cómo se supone que voy a testear <i>ManejarCliente</i>? La idea está en poder testear componentes de manera aislada, y testear este método implica el uso del repositorio y del servicio. Esto ya arruina el testeo, no solo eso, el repositorio necesita hablar con una base de datos <b>real</b> y si en este caso estamos extrayendo un cliente de dicha base de datos, pues vamos a necesitar un cliente con el que poder jugar en el testeo y que luego no joda la aplicación&#8230; Lo suyo sería poder usar una repositorio de mentira en el testeo y así ahorrarnos problemas. Bueno, esto da para un artículo, así que lo dejamos para otro día.</p>
<p>Bueno vale, tenemos una clase muy acoplada con otras, que apenas se puede testear decentemente, que nos haría cambiar mucho código si algún día cambiara los servicios o los repositorios&#8230; Vamos, esto no es mantenible ni por asomo.</p>
<p>¿Cómo lo solucionamos? Tal y como piensas&#8230; Con <b>Dependency Injection</b>. Gracias a este patrón podemos librarnos de todos esos problemas de una forma muuuy sencilla.</p>
<p>Vamos a ver como se vería nuestra clase si implementaros <b>Dependency Injection</b> en ella:</p>
<pre class="brush: csharp;">
public class MiClase
{
	private IMiRepositorio _repo;
	private IUnServicio _servicio;

	public MiClase(IMiRepositorio repositorio, IUnServicio servicio)
	{
		_repo = repositorio;
		_servicio = servicio;
	}

	public Cliente ManejarCliente(int id)
	{
		var cliente = _repo.BuscarCliente(id);
		cliente.Tipo = _servicio.AsignarTipoCliente();

		return cliente;
	}
}
</pre>
<p>Un hombre sabio dijo una vez: Siempre que puedas trabajar con una interfaz hazlo, evita usar implementaciones concretas.</p>
<p>Ahora ya no estamos usando implementaciones concretas, no estamos acoplando el código. Simplemente decimos que necesitamos una implementación de <i>IMiRepositorio</i> y otra de <i>IMiServicio</i>. Tenemos que pasar esas implementaciones en el constructor de la clase, así podemos pasar nuestras propias implementaciones a la hora de hacer unit test. De esta sencilla manera hemos solucionado todos los problemas que he expuesto antes.</p>
<p>Ahora bien&#8230; ¿No sigue siendo un problema tener que ir pasando esas implementaciones a cada clase que lo necesite y a mano? No. Existen una multitud de librerías que hacen el trabajo sucio por nosotros. Éstas librerías tienen unos componentes que se llaman <i>Contenedores</i> que son los encargados de suplir todas estas implementaciones a quien las necesite de forma automágica.</p>
<p>Bueno, en los próximos artículos veremos ejemplos reales de <b>Dependency Injection</b> usando <b>WPF</b> y <b>ASP.NET MVC 3</b>.</p>
<img src="http://feeds.feedburner.com/~r/ElBlogDeFox/~4/IbzCu2DOfpo" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://blog.foxandxss.net/dependency-injection-por-que/feed</wfw:commentRss>
		<slash:comments>4</slash:comments>
		<feedburner:origLink>http://blog.foxandxss.net/dependency-injection-por-que</feedburner:origLink></item>
		<item>
		<title>Dependency Injection: Índice</title>
		<link>http://feedproxy.google.com/~r/ElBlogDeFox/~3/7wwYVz54u1c/dependency-injection-indice</link>
		<comments>http://blog.foxandxss.net/dependency-injection-indice#comments</comments>
		<pubDate>Sun, 13 Feb 2011 12:11:06 +0000</pubDate>
		<dc:creator>Fox</dc:creator>
				<category><![CDATA[Articulos]]></category>
		<category><![CDATA[Dependency Injection]]></category>

		<guid isPermaLink="false">http://blog.foxandxss.net/?p=495</guid>
		<description><![CDATA[Vamonos con unos artículos sobre Dependency Injection, aquí va el índice: Dependency Injection: ¿Por qué? Dependency Injection: MVVM Light + WPF + Unity Dependency Injection: ASP.NET MVC 3 con Ninject Nos vemos en el primer artículo.]]></description>
			<content:encoded><![CDATA[<p>Vamonos con unos artículos sobre <b>Dependency Injection</b>, aquí va el índice:</p>
<ul>
<li><a href="http://blog.foxandxss.net/index.php/dependency-injection-por-que/">Dependency Injection: ¿Por qué?</a></li>
<li><a href="http://blog.foxandxss.net/index.php/dependency-injection-mvvm-light-wpf-unity/">Dependency Injection: MVVM Light + WPF + Unity</a></li>
<li><a href="http://blog.foxandxss.net/index.php/dependency-injection-asp-net-mvc-3-ninject/">Dependency Injection: ASP.NET MVC 3 con Ninject</a></li>
</ul>
<p>Nos vemos en el primer artículo.</p>
<img src="http://feeds.feedburner.com/~r/ElBlogDeFox/~4/7wwYVz54u1c" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://blog.foxandxss.net/dependency-injection-indice/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		<feedburner:origLink>http://blog.foxandxss.net/dependency-injection-indice</feedburner:origLink></item>
		<item>
		<title>Desplegando aplicación MVC 3 con EntityFramework y SQL Server CE 4</title>
		<link>http://feedproxy.google.com/~r/ElBlogDeFox/~3/K0pSVFeFnJc/desplegando-aplicacion-mvc-3-con-entityframework-y-sql-server-ce-4</link>
		<comments>http://blog.foxandxss.net/desplegando-aplicacion-mvc-3-con-entityframework-y-sql-server-ce-4#comments</comments>
		<pubDate>Mon, 07 Feb 2011 21:40:05 +0000</pubDate>
		<dc:creator>Fox</dc:creator>
				<category><![CDATA[Articulos]]></category>
		<category><![CDATA[ASP.NET MVC 3]]></category>
		<category><![CDATA[Entity Framework]]></category>
		<category><![CDATA[SQL Server CE]]></category>

		<guid isPermaLink="false">http://blog.foxandxss.net/?p=490</guid>
		<description><![CDATA[Hooola, ¿Os acordás del tuto de Entity Framework Code-First? Seguro que sí. Pero ahora vamos a dar el segundo paso en este tema. Abrimos nuestra aplicación (Si no la tenéis, podéis descargarlar de aquí). Vale, nuestra misión es poder desplegar la aplicación en un entorno web el cual no tiene ni Entity Framework ni SQL [...]]]></description>
			<content:encoded><![CDATA[<p>Hooola,</p>
<p>¿Os acordás del tuto de <a href="http://blog.foxandxss.net/index.php/entity-framework-code-first/">Entity Framework Code-First</a>?</p>
<p>Seguro que sí. Pero ahora vamos a dar el segundo paso en este tema.<br />
<span id="more-490"></span><br />
Abrimos nuestra aplicación (Si no la tenéis, podéis descargarlar de <a href="www.foxandxss.net/cosasblog/efcodefirst/tutorialefcodefirst.rar">aquí</a>). Vale, nuestra misión es poder desplegar la aplicación en un entorno web el cual no tiene ni <b>Entity Framework</b> ni <b>SQL Server Compact Edition 4</b>, así que vamos a tener que colocar todos los <i>.DLL</i> necesarios para que funcione.</p>
<p>¿Fácil verdad? (No realmente, me costó más de 5 horas lograr la combinación perfecta <img src='http://blog.foxandxss.net/wp-includes/images/smilies/icon_razz.gif' alt=':P' class='wp-smiley' /> ).</p>
<p>Vamos allá. Necesitamos:</p>
<ul>
<li>Entity Framework</li>
<li>SQL Server CE 4</li>
<li>Librería de SQL Server CE 4 para Entity Framework</li>
<li>Ficheros .DLL nativos de SQL Server CE 4</li>
</ul>
<p>Empezamos con NuGet (esto es obligatorio, nos simplifica todo el trabajo), vamos a su consola de gestión de paquetes y hacemos un:</p>
<pre class="brush: plain;">
install-package EFCodeFirst.SqlServerCompact
</pre>
<p>Í‰sto nos instalará las 3 primeras cosas de la lista. Además nos añadirá una regla al <i>Web.config</i>:</p>
<pre class="brush: xml;">
  &lt;system.data&gt;
    &lt;DbProviderFactories&gt;
      &lt;remove invariant=&quot;System.Data.SqlServerCe.4.0&quot; /&gt;
      &lt;add name=&quot;Microsoft SQL Server Compact Data Provider 4.0&quot; invariant=&quot;System.Data.SqlServerCe.4.0&quot; description=&quot;.NET Framework Data Provider for Microsoft SQL Server Compact&quot; type=&quot;System.Data.SqlServerCe.SqlCeProviderFactory, System.Data.SqlServerCe, Version=4.0.0.0, Culture=neutral, PublicKeyToken=89845dcd8080cc91&quot; /&gt;
    &lt;/DbProviderFactories&gt;
  &lt;/system.data&gt;
</pre>
<p>Quizá sea esto lo más importante de todo, pues esto es lo que le indica al servidor que framework de datos estamos usando, sin esto nos dará un hermoso error diciendo que no encuentra dicho framework.</p>
<p>Vale, ya podemos hacer el despliegue.</p>
<p>¿Desplegado? Guay. Si nos fijamos, en el directorio <i>/bin</i> de nuestra aplicación tendremos 4 <i>.DLLs</i> (entre otros)</p>
<ul>
<li>EntityFramework.dll</li>
<li>System.Data.SqlServerCe.dll</li>
<li>System.Data.SqlServerCe.Entity.dll</li>
<li>WebActivator.dll (necesario para el anterior)</li>
</ul>
<p>Ya tenemos los <i>.DLL&#8217;s</i> <i>&#8216;managed&#8217;</i>, ahora necesitamos los nativos. ¿Dónde están? Vamos al directorio <i>packages</i> de nuestra aplicación, aquí encontramos un directorio por cada librería que hemos descargado con <b>NuGet</b>. Nos vamos al de <b>Sql Server CE</b> y dentro de <i>NativeBinaries</i> copiamos ambos directorios (x86 y amd64) al directorio <i>/bin</i> de nuestra aplicación.</p>
<p>Nada más, con esto ya tenemos funcionando nuestra aplicación usando <b>Entity Framework</b> y <b>Sql Server CE 4</b>.</p>
<p>Para muestra un <a href="http://www.foxandxss.net/webs/efcodefirst">botón</a>.</p>
<p>Hasta otra!</p>
<img src="http://feeds.feedburner.com/~r/ElBlogDeFox/~4/K0pSVFeFnJc" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://blog.foxandxss.net/desplegando-aplicacion-mvc-3-con-entityframework-y-sql-server-ce-4/feed</wfw:commentRss>
		<slash:comments>3</slash:comments>
		<feedburner:origLink>http://blog.foxandxss.net/desplegando-aplicacion-mvc-3-con-entityframework-y-sql-server-ce-4</feedburner:origLink></item>
	</channel>
</rss>

