<?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>El Blog de Fox &#187; Articulos</title>
	<atom:link href="http://blog.foxandxss.net/category/articulos/feed" rel="self" type="application/rss+xml" />
	<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>
		<item>
		<title>Desplegando ASP.NET MVC y SQL CE 4 donde no hay soporte</title>
		<link>http://blog.foxandxss.net/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>
]]></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>
		</item>
		<item>
		<title>Truco: Usar Silverlight embebido en ASP.NET MVC</title>
		<link>http://blog.foxandxss.net/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>
]]></content:encoded>
			<wfw:commentRss>http://blog.foxandxss.net/truco-usar-silverlight-embebido-en-asp-net-mvc/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>¡Herramientas de ASP.NET MVC 3 actualizadas!</title>
		<link>http://blog.foxandxss.net/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>
]]></content:encoded>
			<wfw:commentRss>http://blog.foxandxss.net/herramientas-de-asp-net-mvc-3-actualizadas/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Dependency Injection: ASP.NET MVC 3 + Ninject</title>
		<link>http://blog.foxandxss.net/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>
]]></content:encoded>
			<wfw:commentRss>http://blog.foxandxss.net/dependency-injection-asp-net-mvc-3-ninject/feed</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Dependency Injection: MVVM Light + WPF + Unity</title>
		<link>http://blog.foxandxss.net/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>
]]></content:encoded>
			<wfw:commentRss>http://blog.foxandxss.net/dependency-injection-mvvm-light-wpf-unity/feed</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Dependency Injection: ¿Por qué?</title>
		<link>http://blog.foxandxss.net/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>
]]></content:encoded>
			<wfw:commentRss>http://blog.foxandxss.net/dependency-injection-por-que/feed</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>Dependency Injection: Índice</title>
		<link>http://blog.foxandxss.net/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>
]]></content:encoded>
			<wfw:commentRss>http://blog.foxandxss.net/dependency-injection-indice/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Desplegando aplicación MVC 3 con EntityFramework y SQL Server CE 4</title>
		<link>http://blog.foxandxss.net/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>
]]></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>
		</item>
		<item>
		<title>Entity Framework Code-First</title>
		<link>http://blog.foxandxss.net/entity-framework-code-first</link>
		<comments>http://blog.foxandxss.net/entity-framework-code-first#comments</comments>
		<pubDate>Sat, 22 Jan 2011 17:58:54 +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=486</guid>
		<description><![CDATA[Hola a todos, Hoy vamos a hablar de una de las formas que tenemos para crear una base de datos para nuestro proyecto. Concretamente de Entity Framework Code-First. Antes de hablar de EF Code-First vamos a recordar brevemente cual es la manera común de crear una base de datos usando Entity Framework: Si queríamos hacer [...]]]></description>
			<content:encoded><![CDATA[<p>Hola a todos,</p>
<p>Hoy vamos a hablar de una de las formas que tenemos para crear una base de datos para nuestro proyecto. Concretamente de <b>Entity Framework Code-First</b>.<br />
<span id="more-486"></span><br />
Antes de hablar de <b>EF Code-First</b> vamos a recordar brevemente cual es la manera común de crear una base de datos usando <b>Entity Framework</b>:</p>
<p>Si queríamos hacer uso de bases de datos en nuestra aplicación, lo más común era crear una base de datos (Usando Sql Server normal, express o compact edition), crear sus tablas y añadir algúna que otra fila para probar nuestra base de datos.</p>
<p>Una vez teníamos nuestra base de datos lista, creabamos un <b>ASP.NET Entity Data Model</b> que haría de intemerdiario entre nuestra aplicación y la base de datos. Dicho <i>.edmx</i> (Entity Data Model) <b>GENERABA</b> clases por cada tabla de nuestra base de datos.</p>
<p>Por ejemplo, si teníamos una clase <i>Persona</i> y una clase <i>Trabajo</i>, el <i>Entity Data Model</i> generaría una clase llamada <i>Personas</i> y otra llamada </i>Trabajos</i> que serían como ya he dicho, la representación de las tablas de la base de datos en clases C#.</p>
<p>La idea es buena, muy buena. El problema es que las clases que se generan, pueden contener mucha redundancia y por normal general no son nada limpias (Luego veremos un ejemplo).</p>
<p>Entonces&#8230; ¿Hay alguna otra manera? Por supuesto. Aquí es donde entra:</p>
<h3>Entity Framework Code-First</h3>
<p>Como su nombre indica (El código primero), nos incita a escribir primero las clases que representan las tablas y luego crear dichas tablas.</p>
<p>En otras palabras, crearemos una clase por cada tabla de la base de datos, y luego generaremos dichas tablas automáticamente (sin redundancias ni nada).</p>
<p>Para este ejemplo vamos a usar <b>ASP.NET MVC 3</b> y <b>Sql Server Compact Edition 4</b>. En caso de que no lo tengás instalado, podéis usarlo en cualquier otro tipo de aplicación, <b>WPF</b>, <b>ASP.NET 4</b>&#8230; La idea y el conocimiento adquirido vale para cualquier otro tipo de proyecto.</p>
<p>Aún así, recomiendo usar SQLServerCE 4 a todos aquellos que necesiten bases de datos pequeñitas y embebidas y así no tirar de mastodontes como Sql Server.</p>
<blockquote><p>NOTA: Necesitas del Service Pack 1 de VS2010 instalado para poder hacer uso de SQLServerCE 4 (A dia de hoy es beta, pero perfectamente usable)</p></blockquote>
<p>Pensando que tenéis instalado Asp.NET MVC 3, SQl Server CE 4 (tanto toolkit como el runtime) y VS2010 SP1 Beta pues vamos allá:</p>
<p>Iniciamos un nuevo proyecto <b>ASP.NET MVC 3</b>, lo llamaremos: <i>TutorialEFCodeFirst</i>. Le decimos que queremos una aplicación de internet para no tener que marearnos con cosas irrelevantes para este artículo.</p>
<p>Una vez tengamos nuestro proyecto creado, necesitamos añadir <b>Entity Framework</b> a nuestro proyecto, para ello lo mejor sería usar <a href="http://blog.foxandxss.net/index.php/nupack/">NuGet</a> para facilitarnos la vida.</p>
<p>Abrimos la consola de NuGet yendo al menú <i>View->Other Windows->Package Manager Console</i>. Una vez en la consola simplemente tenemos que teclear:</p>
<p><b>Install-package EFCodeFirst</b></p>
<p>Con esto ya tendremos la librería cargada en nuestro proyecto.</p>
<p>Ahora vamos con la base de datos&#8230; ¿Qué vamos a representar? Qué tal si seguimos con el ejemplo anterior de personas y trabajos? Pues vamos a ello:</p>
<p>Click derecho en <i>Models</i>, añadir nueva clase, la cual llamaremos <i>Persona</i>:</p>
<pre class="brush: csharp;">
public class Persona
{
	public int ID { get; set; }
	public int TrabajoID { get; set; }
	public string Nombre { get; set; }
	public int Edad { get; set; }

	public virtual Trabajo Trabajo { get; set; }
}
</pre>
<p>Añadiremos también una clase llamada <i>Trabajo</i>:</p>
<pre class="brush: csharp;">
public class Trabajo
{
	public int ID { get; set; }
	public string Nombre { get; set; }
	public string Descripcion { get; set; }

	public virtual ICollection&lt;Persona&gt; Personas { get; set; }
}
</pre>
<p>Como véis, no dejan de ser clases normales. No tienen nada fuera de lo común y no heredan de ningún tipo de clase o interfaz. Lo interesante es:</p>
<p>La relación entre la clase <i>Trabajo</i> y <i>Persona</i> es <i>1:N</i>. Eso quiere decir que un trabajo puede hacerlo varias personas y una persona tiene un trabajo. La teoría de base de datos nos dice que en estos casos, la clave de la tabla que tiene el <i>1</i> se propaga a la clase <i>N</i>. En este caso, en la clase/tabla <i>Persona</i> tendremos una referencia al ID de <i>Trabajo</i>.</p>
<p>A parte de esto, cada clase ha de tener digamos un &#8220;enlace&#8221; con cada clase que se relaciona. En este caso:</p>
<p><i>Persona</i> se relaciona con <i>Trabajo</i> y como <i>Persona</i> solo se relaciona con una instancia de <i>Trabajo</i> pues guardamos una simple instancia.<br />
En el otro caso, como <i>Trabajo</i> se relaciona con muchas <i>Persona</i>s pues guardará una colección de estas.<br />
Vale, ya tenemos las clases que serán las tablas de la base de datos, pero todavía necesitamos la última pieza que hará que todo esto funcione.</p>
<p>Si habéis generado las clases a partir de la base de datos como comenté al principio del artículo, veréis que además de las clases, genera una clase llamada <i>Contexto</i> la cual nos hace de intermediario entre la base de datos y nuestro código.</p>
<p>En nuestro caso, necesitamos escribir esa clase manualmente, pero claro, queda mucho más simple que su homóloga. Por simplicidad, crearemos este contexto en la carpeta <i>Models</i>:</p>
<pre class="brush: csharp;">
public class TutorialContext : DbContext
{
	public DbSet&lt;Persona&gt; Personas { get; set; }
	public DbSet&lt;Trabajo&gt; Trabajos { get; set; }
}
</pre>
<p>Como véis, es una clase bastante sencillita, simplemente creamos una propiedad del tipo <i>DbSet<T></i> por cada clase que pasará a ser una tabla.</p>
<p>Ahora necesitamos especificar la cadena de conexión a la base de datos que se va a generar. Para el caso de <b>SQL Server CE 4</b> sería así (tenemos que escribirla en el Web.config):</p>
<pre class="brush: xml;">
&lt;connectionStrings&gt;
	&lt;add name=&quot;ApplicationServices&quot;
		 connectionString=&quot;data source=.SQLEXPRESS;Integrated Security=SSPI;AttachDBFilename=|DataDirectory|aspnetdb.mdf;User Instance=true&quot;
		 providerName=&quot;System.Data.SqlClient&quot; /&gt;
	&lt;add name=&quot;TutorialContext&quot; connectionString=&quot;Data Source=|DataDirectory|tutorial.sdf&quot; providerName=&quot;System.Data.SqlServerCE.4.0&quot;/&gt;
&lt;/connectionStrings&gt;
</pre>
<p>La cadena de conexión consta de 3 partes.</p>
<p>En <i>name</i> pondremos el nombre de la clase que hace de <i>Contexto</i>, en nuestro caso es <i>TutorialContext</i>.<br />
En <i>connectionString</i> colocamos la ruta donde irá nuestra base de datos, en nuestro caso irá a la carpeta <i>App_Data</i>(DataDirectory).<br />
en <i>providerName</i> colocamos la librería que usaremos para esto, en este caso es la libreria de <b>SQL Server CE 4</b>.</p>
<p>Ya está, no hay más. Nuestra base de datos ya está lista. Hemos creados las clases, hemos creado el contexto y finalmente hemos puesto la cadena de conexión. Nuestra base de datos se generará cuando se haga uso de ella por primera vez.</p>
<p>Vamos a probarla.</p>
<p>Por simplicidad abrimos el <i>HomeController</i> y ahí probaremos nuestra base de datos.</p>
<p>Cambiaremos el método <i>Index</i> por el nuestro propio:</p>
<pre class="brush: csharp;">
public ActionResult Index()
{
	var db = new TutorialContext();

	var personas = from p in db.Personas
				   select p;

	return View(personas.ToList());
}
</pre>
<p>Nada fuera de lo común. El uso de nuestra base de datos es exactamente el mismo que si hubiesemos usado el otro método. Simplemente instanciamos el contexto, y como ejemplo creamos una lista de personas y la enviamos a la vista.</p>
<blockquote><p>NOTA: Es recomendable crear un repositorio que haga de intermediario entre nuestra aplicación y la base de datos, pero para simplificar el artículo vamos a usar el contexto directamente.</p></blockquote>
<p>Abrimos <i>Index.cshtml</i> y modificamos la vista acorde a nuestra aplicación:</p>
<pre class="brush: xml;">
@model IEnumerable&lt;TutorialEFCodeFirst.Models.Persona&gt;

@{
    ViewBag.Title = &quot;Lista de personas&quot;;
}

&lt;h2&gt;Lista de personas&lt;/h2&gt;

@foreach (var per in Model)
{
    &lt;div&gt;
        &lt;h2&gt;@per.Nombre - @per.Edad&lt;/h2&gt;
        @if (per.Trabajo != null)
        {
            &lt;h3&gt;@per.Trabajo.Nombre&lt;/h3&gt;
        }
    &lt;/div&gt;
}
</pre>
<p>Si ejecutamos nuestra aplicación veremos que no sale ninguna persona:</p>
<p><a href="http://blog.foxandxss.net/cosasblog/efcodefirst/1.PNG"><img alt="" src="http://blog.foxandxss.net/cosasblog/efcodefirst/1.PNG" class="alignnone" width="591" height="239" /></a></p>
<p>Normal, no hemos añadido ninguna persona.</p>
<p>Ahora bien, si en el <b>Visual Studio</b> hacemos click en el botón para ver todos los archivos del proyecto, podemos ver que dentro de <i>App_Data</i> aparece nuestra base de datos.</p>
<p><a href="http://blog.foxandxss.net/cosasblog/efcodefirst/2.PNG"><img alt="" src="http://blog.foxandxss.net/cosasblog/efcodefirst/2.PNG" class="alignnone" width="260" height="287" /></a></p>
<p>Hacemos click derecho en la base de datos y le damos a incluir en el proyecto.</p>
<p>Si ahora hacemos doble click en la base de datos, podremos ver la información de esta. Podremos ver sus tablas, etc.</p>
<p><a href="http://blog.foxandxss.net/cosasblog/efcodefirst/3.PNG"><img alt="" src="http://blog.foxandxss.net/cosasblog/efcodefirst/3.PNG" class="alignnone" width="218" height="205" /></a></p>
<p>¿Trabajoes? A mi me ha creado la tabla con ese nombre&#8230; No pasa nada, podemos decirle al contexto qué nombre usar a la hora de crear la tabla, es tan fácil como sobreescribir un método:</p>
<pre class="brush: csharp;">
protected override void OnModelCreating(ModelBuilder modelBuilder)
{
	modelBuilder.Entity&lt;Persona&gt;()
		.ToTable(&quot;Personas&quot;);
	modelBuilder.Entity&lt;Trabajo&gt;()
		.ToTable(&quot;Trabajos&quot;);
}
</pre>
<p>Simplemente a la hora de mapear las clases a tablas, elegimos el nombre.</p>
<p>Ahora sí:</p>
<p><a href="http://blog.foxandxss.net/cosasblog/efcodefirst/4.PNG"><img alt="" src="http://blog.foxandxss.net/cosasblog/efcodefirst/4.PNG" class="alignnone" width="210" height="211" /></a></p>
<p>Ya que estamos vamos a añadir algunos datos, ¿No?</p>
<p>Hacemos click derecho en la tabla <i>Trabajos</i> y le damos a que nos muestre los datos de las personas. Lo dejaremos así:</p>
<p><a href="http://blog.foxandxss.net/cosasblog/efcodefirst/5.PNG"><img alt="" src="http://blog.foxandxss.net/cosasblog/efcodefirst/5.PNG" class="alignnone" width="539" height="116" /></a></p>
<p>Ahora hacemos lo mismo con la tabla <i>Personas</i> pero usando estos datos:</p>
<p><a href="http://blog.foxandxss.net/cosasblog/efcodefirst/6.PNG"><img alt="" src="http://blog.foxandxss.net/cosasblog/efcodefirst/6.PNG" class="alignnone" width="440" height="131" /></a></p>
<p>Ahora que tenemos datos, simplemente tenemos que ejecutar otra vez nuestra aplicación:</p>
<p><a href="http://blog.foxandxss.net/cosasblog/efcodefirst/7.PNG"><img alt="" src="http://blog.foxandxss.net/cosasblog/efcodefirst/7.PNG" class="alignnone" width="567" height="510" /></a></p>
<p>Ahí están nuestros datos!!</p>
<p>¿Fácil verdad? Solo hemos tenido que crear las clases que serán tablas, el contexto, la cadena de conexión y finalmente introducir algunos datos de prueba.</p>
<p>Bueno, hasta aquí la introducción a <b>EF Code First</b>. Espero vuestros comentarios.</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.foxandxss.net/entity-framework-code-first/feed</wfw:commentRss>
		<slash:comments>12</slash:comments>
		</item>
		<item>
		<title>Ya soy usuario de WP7, HTC 7 Trophy</title>
		<link>http://blog.foxandxss.net/ya-soy-usuario-de-wp7-htc-7-trophy</link>
		<comments>http://blog.foxandxss.net/ya-soy-usuario-de-wp7-htc-7-trophy#comments</comments>
		<pubDate>Tue, 30 Nov 2010 14:32:24 +0000</pubDate>
		<dc:creator>Fox</dc:creator>
				<category><![CDATA[Reseñas]]></category>
		<category><![CDATA[Windows Phone 7]]></category>

		<guid isPermaLink="false">http://blog.foxandxss.net/?p=474</guid>
		<description><![CDATA[Hola! Por fin soy usuario de Windows Phone 7. Llevaba un tiempo detrás de el para poder desarrollar para el. En este caso ha sido un HTC 7 Trophy de Vodafone. Me gustaría centrarme un poco más en el teléfono que en SO en sí, puesto que todos sabemos qué tan bueno es El telefono [...]]]></description>
			<content:encoded><![CDATA[<p>Hola!</p>
<p>Por fin soy usuario de <b>Windows Phone 7</b>. Llevaba un tiempo detrás de el para poder desarrollar para el.</p>
<p>En este caso ha sido un <a href="http://www.htc.com/es/product/7trophy/overview.html">HTC 7 Trophy</a> de Vodafone.<br />
<span id="more-474"></span><br />
Me gustaría centrarme un poco más en el teléfono que en SO en sí, puesto que todos sabemos qué tan bueno es <img src='http://blog.foxandxss.net/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
<p>El telefono en si tiene un buen acabado y un buen tacto.</p>
<p>Tiene 4 botones. Los dos de volumen, el power y el de la cámara (lo cual es un bueeeen extra).</p>
<p>Ya hablando de cámara, no deja de ser una cámara normal de 5mp con una calidad puerca, las cosas como son, de nada valen los megapíxeles si el objetivo es mas pequeño que una uña del dedo chico&#8230; Eso sí, tiene un flash bastante hermoso.</p>
<p>Es capaz de grabar videos a 720p, pero seguimos en las mismas, con ese objetivo no se consigue nada en condiciones.</p>
<p>Aparte de los botones físicos, tiene los 3 típicos botones de todo teléfono WP7, el de ir atrás, el de windows (boton inicio) y el de buscar. Estos 3 botones son táctiles (vamos, forman parte de la pantalla). La verdad es que el tacto es muy bueno y reaccionan perfectamente los botones.</p>
<p>Es un teléfono con una pantalla de 3,8&#8243; y la verdad, es gigante y la calidad de imagen la veo bastante bien, la reacción al tacto, a los movimientos&#8230; Todo está bien bien.</p>
<p>Eso si, tiene una pega, al parecer están veniendo mal muchos de estos terminales. Es como si el protector de la pantalla estuviese mal pegado y le empiezan a salir burbujas debajo de este. Nada grave, pero es una molestia tener que estar detrás de htc para que te lo cambien y tal.</p>
<p>Por otro lado, WP7 está bien, solo que todavía han de ir puliendo algún que otro fallo y pequeñas cosas más.</p>
<p>Yo recomiendo este teléfono sin duda, es una joya, aunque eso si, esperaría un poco a ver si sacan una remesa que no tenga el problema cosmético que tiene este.</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.foxandxss.net/ya-soy-usuario-de-wp7-htc-7-trophy/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>

