Yo Programo .NET

Video ALT.NET Hispano: Hadi Hariri ASP.NET MVC

May 3, 2009 08:07 by fabian
Categorías: .NET | ALT.NET | ASP.NET MVC | C# | MVC | Videos

Ayer se llevo a cavo la segunda reunión VAN de ALT.NET Hispano, en esta oportunidad Hadi Hariri expuso sobre ASP.NET MVC.

Video:

Algunos temas tocados en la charla:

  • ¿Que es MVC? - Definición del patrón MVC
  • Controladores
  • Vistas
  • Modelo
  • Rutas – Rutas amigables y modificación de rutas
  • ASP.NET Routing Debugger
  • Vistas tipadas
  • ViewData y ViewData.Model
  • Generación de código, CRUD con plantillas T4
  • Testeo de controladores con pruebas unitarias usando xUnit

Hadi en su blog escribió un post relacionado a esta reunión donde publicó el código fuente de los ejemplos utilizados en la reunión.

ALT.NET Hispano - Primera Reunión VAN

April 25, 2009 11:01 by fabian
Categorías: .NET | C#

skype

Acaba de concluir la primera reunión VAN de ALT.NET Hispano con un saldo más que positivo para mi. Hemos podido conocernos (al menos nuestras voces) y charlamos sobre muchas cosas.

Al principio hemos tenido problemas de audio, skype no ayudó en esto. Pero luego pudimos solucionarlo y la reunión se pudo realizar.

Primero, Leandro Valido dio una disertación muy buena sobre DSL (Lenguajes de dominio especifico) y explicó sobre su trabajo que realizó en la implementación de esta metodología bajo SQL Server y .NET.

Luego charlamos sobre el futuro de la comunidad, Jorge comentó algunas de sus ideas, como por ejemplo crear un agregador de blogs.
Analizamos varias herramientas que quizás nos puedan ayudar a realizar este agregador. una de las aplicaciones analizadas fue KIGG.

Daniel comentó su trabajo en el FrameWork Cooperator, explicó su funcionamiento y futuras ideas que piensan implementar al framework.

Hasta la próxima reunión!

Objetos Mock - ¿Qué son?

April 24, 2009 04:33 by fabian
Categorías: .NET | C#

reuniondevelopers

Recuerdo, con compañeros de trabajo solíamos hacer bromas con esto. “Te mandaste un Mocko!” jeje un clásico. Pero la verdad es que poder entender lo que en verdad son los objetos Mock me llevo 4 horas exactas. (Una mañana de trabajo) ;)
Esa mañana aprendí lo que era un objeto proxy, aprendí como hardcodear este objeto proxy para pruebas unitarias, etc.

Luego por simple deducción pude entender que era un objeto Mock y que su uso está fuertemente enlazado con el trabajo en pruebas de unidad.

Definición simple y rápida, ¿Que son los objetos Mock?

Un Mock es un objeto que simula ser otro (Proxy) y es posible hard-codear sus propiedades y las respuestas de sus métodos muy fácilmente.

¿Y para que me sirve esto?

Ok, recuerda que ahora esta de moda el desarrollo TDD, esto nos obliga a realizar las pruebas unitarias antes de empezar a programar. ¿Pero como probamos clases que en realidad no existen? Para esto esta Mock, para ayudarnos a crear objetos proxy a partir de una interface común con valores hardcodeados que luego podremos usarlos en distintas partes de nuestras pruebas. Por ejemplo, quizás tengas una clase con inyección de dependencias, esta clase recibe un objeto en su constructor y este objeto podría ser un objeto Mock que implemente una interface común.

Ejemplos Mocks:

Pero para aprender lo mejor es ver ejemplos, con este ejemplo utilizando NUnit.Mocks que te mostraré seguro entenderás en el primer vistazo.

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using NUnit.Mocks;
using NUnit.Framework;
namespace ClassLibrary1.Test {
    [TestFixture]
    public class PruebaMock {
        [Test]
        public void Prueba1()
        {
            DynamicMock objMock = new DynamicMock(typeof(IMyMock));
            objMock.ExpectAndReturn("get_Ip", "1.1.1.1");
            Assert.AreEqual("1.1.1.1", ((IMyMock)objMock.MockInstance).Ip);
        }
    }
    public interface IMyMock
    {
        string Ip { get; }
    }
}

Como ven, creamos un objeto dinámico Mock a partir de una interface, luego podemos hardcodear las respuestas de todos sus métodos y propiedades, en este ejemplo hardcodeo la respuesta “1.1.1.1” a la propiedad IP.

Frameworks y herramientas para trabajar con Mocks:

  • NUnit (NUnit.Mocks)
  • Moq – Mock + Linq

Foto: flickr.com

ALT.NET Hispano - Primeras reuniones

April 24, 2009 03:11 by fabian
Categorías: .NET | C#

image Me agrada ver el cambio que estoy notando en la comunidad .NET, desde que comenzaron a nacer proyectos open source bajo .NET estos cambios se hicieron mas notorios.

Junto con este impulso es que nació ALT.NET Hispano. Una comunidad de programadores hispanos de todo el mundo donde comparten sus ideas y experiencias sobre programación .NET. (Leer mas información sobre ALT.NET Hispano)

Existe un grupo en google donde los desarrolladores hispanos se encuentran para debatir, compartir y programar reuniones.

Jorge Gamba lanzó el reto de la primera reunión ALT.NET Hispano tipo VAN (Reuniones virtuales usando Skype y otras herramientas) que se llevará a cabo mañana, sábado 25. Existe una lista de miembros, en la cual los aspirantes en asistir a dicha reunión deberán agregar su nombre a la lista.

alnet
Scott Hanselman en ALT.NET Seattle

En esta primera reunión Jorge será el administrador en la reunión y el disertador será Leandro que expondrá sobre DSL (Lenguajes de dominio especifico). Suena súper interesante para mi el tema y por eso verán mi nombre en la lista de asistentes. Espero que hayan mas reuniones de este tipo, es crucial que apoyemos estos eventos.
La publicidad boca a boca, un post en tu blog, un mensaje en el foro, todo es bienvenido.

Introducción a NUnit – Pruebas de unidad

April 23, 2009 11:25 by fabian
Categorías: C# | .NET

program

Quizás en estos días estés escuchando el termino TDD (Desarrollo guiado por pruebas), estas pruebas de unidad nos ayudan a crear aplicaciones robustas y reducir la cantidad de errores.
Lo más llamativo de esta manera de programar es que las pruebas unitarias se realizan en primer lugar y luego el desarrollo consta en superar estas pruebas.

¿Que es una prueba de unidad o unit test?

Es una porción de código con la única función de realizar pruebas o testeos a métodos o clases.

NUnit Framework

Hay una herramienta muy poderosa y conocida por todos los desarrolladores llamada NUnit, este framework nos ayudará a crear nuestros proyectos unit test.

Atributos NUnit

Existen algunos atributos expuestos por el framework que nos ayudaran a marcar diferentes áreas de nuestras clases para realizar pruebas. Aquí están los atributos básicos.

  • [TestFixture]: Con este atributo informamos que la clase es una clase de prueba y expone métodos para pruebas.
  • [SetUp]: Se utiliza para marcar un método que usaremos para instanciar objetos comunes que luego serán usados por los demás métodos. Solo puede existir un método con el atributo SetUp.
  • [Test]: Especifica un método dentro de una clase como un método de prueba. Dentro de un clase marcada como TestFixture pueden haber varios métodos con el atributo Test.
  • [TearDown]: Luego que las pruebas han sido ejecutadas el método con el atributo TearDown es el encargado de limpiar el ambiente, por ejemplo aniquilar objetos.

Leer mas información sobre atributos NUnit

Informacion sobre NUnit:

Descargar: NUnit 2.4.8
Foto: flickr.com

Usando Reflection para crear objetos con clases de App_Code

March 24, 2009 02:29 by fabian
Categorías: .NET | C#

Reflection es una característica .NET que nos permite observar propiedades, atributos, métodos, etc de objetos o clases en momento de ejecución.

Hoy veremos, como con Reflection creamos objetos dinámicamente utilizando las clases que estén alojadas en la carpeta App_Code de nuestra aplicación Web.

//Load App_Code Class by Reflection
if (System.Web.Compilation.BuildManager.CodeAssemblies != null) {
    foreach (
        System.Reflection.Assembly assembly 
            in 
                System.Web.Compilation.BuildManager.CodeAssemblies) {
                    var types = assembly.GetExportedTypes();
                    if (types == null || types.Length == 0)
                        continue;
                    foreach (Type type in types) {
                        Activator.CreateInstance(type);
        }
    }
}

Con este pequeño porción de código que incluí en AFDS puedo cargar los plugins (Clases) que están en la carpeta App_Code.

Más información sobre Reflection .NET

Patrones: Proxy en C#

March 13, 2009 19:06 by fabian
Categorías: .NET | C#

Siguiendo con Patrones en C#, hoy veremos el patrón Proxy. Otro patrón muy utilizado por todos nosotros los programadores. Quizás hayas escuchado hablar de las clases Wrappers, bueno, lo que veremos hoy es eso, simular un objeto que en realidad enmascara a otro.

¿Para que se usa este patrón?

Para manejar el control de creación del objeto y el acceso a otros objetos. Para protección de clases y optimizar el consumo de memoria dado que es posible crear objetos solo cuando algún método de la clase es llamado.

Participantes:

  • Una clase real o clase a enmascarar por la clase proxy.
  • Una interface que compartirán los dos objetos, la clase real y la proxy.

Situación o contexto para usar este patrón:

Imaginemos dos situaciones.

La primer situación seria crear una clase Proxy virtualizadora, que en realidad, como la clase solo enmascara a otra clase no necesariamente crea ese objeto. Nosotros podríamos requerir que ese objeto sea creado solamente cuando un método es ejecutado.

La otra seria: Nosotros podremos hacer otra clase proxy para seguridad , por medio de métodos y propiedades esta clase proxy podría solicitar usuario y contraseña, luego de un proceso de control y si es satisfactorio se creará el objeto y se ejecutará el método del mismo.

Código ejemplo del Patrón Proxy

    //Por Fabián Figueredo
    //http://oberdata.com.ar
    public interface IGallina
    {
        string Cacarear();
    }
    public class Gallina : IGallina
    {
        #region IGallina Members
        public string Cacarear()
        {
            return "Cocorocoóó";
        }
        #endregion
    }
    public class GallinaProxy : IGallina
    {
        Gallina obj;
        #region IGallina Members
        public string Cacarear()
        {
            // La clase proxy solo crea el objeto 
            // la primera vez que se llama al método
            if (obj == null)
            {
                Console.WriteLine("Creando Gallina..");
                obj = new Gallina();
            }
            Console.WriteLine("Gallina ya creada..");
            return "Desde clase GallinaProxy: " + obj.Cacarear();
        }
        #endregion
    }
    public class GallinaProxySec : IGallina
    {
        Gallina obj;
        string password = "pichichu";
        public string Autenticar(string pass)
        {
            if (pass != password)
                return "Desde GallinaProxySec Error: El password no es correcto";
            else
                obj = new Gallina();
            return "Desde GallinaProxySec: Se creó el objeto gallina con éxito";
        }
        #region IGallina Members
        public string Cacarear()
        {
            if (obj == null)
            {
                return "Desde GallinaProxySec: Primero debe Autenticar..";
            }
            else {
                return "Desde GallinaProxySec: " + obj.Cacarear();            
            }
        }
        #endregion
    }
    class Program
    {
        static void Main(string[] args)
        {
            Console.WriteLine("Desde el objeto Gallina directamente\n");
            Gallina obj = new Gallina();
            Console.WriteLine(obj.Cacarear());
            Console.WriteLine("Ahroa las clases Proxy\n");
            //Solo con virtualización
            IGallina objProxy = new GallinaProxy();
            Console.WriteLine(objProxy.Cacarear()); //ahora creará el objeto
            Console.WriteLine(objProxy.Cacarear()); //el objeto ya estará creado
            //Con seguridad
            GallinaProxySec objProxySec = new GallinaProxySec();
            Console.WriteLine(objProxySec.Cacarear());
            Console.WriteLine((objProxySec as GallinaProxySec).Autenticar("nose"));
            Console.WriteLine(objProxySec.Cacarear());
            Console.WriteLine((objProxySec as GallinaProxySec).Autenticar("pichichu"));
            Console.WriteLine(objProxySec.Cacarear());
        }
    }

Patrones - Factory Method en C#

March 12, 2009 19:02 by fabian
Categorías: .NET | C# | Patrones

El patrón Factory Method es uno de mis preferidos, antes que no tenia ni idea que era un patrón también lo usaba sin saberlo. Pero vayamos al grano y veamos en que consiste este patrón.

¿Para que se usa este patrón?

Para hacer instancias, para crear objetos de alguna clase.
Relacionarlo con: Factory Method –> “Método de Fabricación de Objetos”

Situación o contexto para usar este patrón:

Por ejemplo, si no queremos que realicen instancias a clases directamente o si queremos abstraer por completo nuestras clases base, separando todo el código de creación de objetos en un método o en otra clase. etc.

Imaginemos que estamos trabajando en un equipo, al comenzar el desarrollo de cualquier proyecto serio, los arquitectos tienen el trabajo de crear las interfaces y las clases helpers y factory. ¿Porque lo hacen? Pues, imagina que cada programador implemente de distinta manera cada objeto, seria un dolor de cabeza en solo pensarlo.

Para esto esta este patrón, para separar el código de creación de objetos en un método o clase. No es mas que eso. ;)

Ejemplo:

    public abstract class Perro {
        public string nombre;
        public string raza;
        public abstract string GetNombre();
        public enum nombresdeperros { Pepe, Mumi, Conan }    
    }
    public class PerroPepe : Perro
    {
        public PerroPepe()
        {
            nombre = "Pepe";
            raza = "Ovejero Alemán";
        }
        public override string GetNombre()
        {
            return nombre;
        }
    }
    public class PerroMumi : Perro {
        public PerroMumi() 
        {
            nombre = "Mumi";
            raza = "Mestizo";
        }
        public override string GetNombre()
        {
            return nombre;
        }
    }
    public class PerroConan : Perro
    {
        public PerroConan()
        {
            nombre = "Conan";
            raza = "Boxer";
        }
        public override string GetNombre()
        {
            return nombre;
        }
    }
    //Clase Factory
    public static class PerroFactory{
        //El Factory Method
        public static Perro CrearPerro(Perro.nombresdeperros nombre) {
            switch (nombre) { 
                case Perro.nombresdeperros.Pepe:
                    return new PerroPepe();
                    break;
                case Perro.nombresdeperros.Conan:
                    return new PerroConan();
                    break;
                case Perro.nombresdeperros.Mumi:
                    return new PerroMumi();
                    break;
                default:
                    break;
            }
            //No hay perro con ese nombre
            throw new Exception("Tipo no reconocido");
        } 
    }
    class Program
    {
        static void Main(string[] args)
        {
            Perro mumi = 
                PerroFactory.CrearPerro(
                    Perro.nombresdeperros.Mumi);
            Console.WriteLine(mumi.nombre + " es " + mumi.raza);
        }
    }

Actualización:

Diego me señaló un error, en este ejemplo se ve un patrón simple de Factory. Ahora mas abajo les muestro un ejemplo completo aplicando Factory Method como es debido. Gracias Diego!

using System;
public abstract class Perro {
    public string nombre;
    public string raza;
    public abstract string GetNombre();
    public enum nombresdeperros { Pepe, Mumi, Conan }
}
public class PerroPepe : Perro {
    public PerroPepe() {
        nombre = "Pepe";
        raza = "Ovejero Alemán";
    }
    public override string GetNombre() {
        return nombre;
    }
}
public class PerroMumi : Perro {
    public PerroMumi() {
        nombre = "Mumi";
        raza = "Mestizo";
    }
    public override string GetNombre() {
        return nombre;
    }
}
public class PerroConan : Perro {
    public PerroConan() {
        nombre = "Conan";
        raza = "Boxer";
    }
    public override string GetNombre() {
        return nombre;
    }
}
abstract class Creator {
    public abstract Perro FactoryMethod();
}
class MumiCreator : Creator
{
    public override Perro FactoryMethod() {
        return new PerroMumi();
    }
}
class ConanCreator : Creator {
    public override Perro FactoryMethod() {
        return new PerroConan();
    }
}
class PepeCreator : Creator {
    public override Perro FactoryMethod() {
        return new PerroPepe();
    }
}
public static class PerroFactory {
    public static Perro CrearPerro(Perro.nombresdeperros nombre) {
        switch (nombre) {
            case Perro.nombresdeperros.Pepe:
                return new PepeCreator().FactoryMethod();
                break;
            case Perro.nombresdeperros.Conan:
                return new ConanCreator().FactoryMethod();
                break;
            case Perro.nombresdeperros.Mumi:
                return new MumiCreator().FactoryMethod();
                break;
            default:
                break;
        }
        //No hay perro con ese nombre
        throw new Exception("Tipo no reconocido");
    }
}
class Program {
    static void Main(string[] args) {
        Perro mumi =
            PerroFactory.CrearPerro(
                Perro.nombresdeperros.Mumi);
        Console.WriteLine(mumi.nombre + " es " + mumi.raza);
    }
}

Mejores Blogs de .NET (Español)

March 12, 2009 11:15 by fabian
Categorías: .NET | C#

Estos son, que a mi entender, los mejores blogs en español para aprender y actualizarse en .NET.

  • Blog de Eugenio Serrano
    eugenio
    Eugenio es un programador cordobés con amplia experiencia en programación. Es MVP de Microsoft, orador de INETA y trabaja para Solid Quality Mentors
  • El bruno
    elbruno
    Blog sobre experiencias en la vida de un programador con tecnologías Microsoft
  • Espacio de Dario Quintana
    dario
    Programador misionero con amplia experiencia, pertenece al team del framework NHibernate.
  • Subgurim.NET
    suber
    Ultimas noticias sobre .NET, ejemplos prácticos y buenos tutoriales.

ASP.NET MemberShip: Control Login no hace bien el Logout

March 11, 2009 11:49 by fabian
Categorías: .NET | C# | BlogEngine

Por alguna razón el control Login del MemberShip no hace bien el logout, pero no siempre es así, solo se da cuando indicamos en el formulario de login que deseamos que guarde la contraseña para un posterior logueo.

Este error lo estoy encontrando en la ultima versión de BlogEngine, de esta manera podemos dejar nuestro blog vulnerable, porque si por error dejamos guardadas nuestras cookies cualquier persona que use la misma maquina tendrá acceso a nuestra cuenta sin necesidad de hacer login.

Una solución, que por ahí alguno podría decir que no es para nada practica, a lo cual yo contestaría “Pero funciona!!”, consiste en hacer a mano los enlaces de entrada y salida de sesión, de esta manera, en el caso de BlogEngine, deberemos crear una pagina para el logout nada mas, dado que la pagina para login ya existe.

En el code-behind de la pagina logout.aspx colocamos lo siguiente para cerrar la sesión.

public partial class logout : System.Web.UI.Page
{
    protected void Page_Load(object sender, EventArgs e)
    {
        FormsAuthentication.SignOut();
        FormsAuthentication.RedirectToLoginPage();
    }
}

Luego, en el master page de nuestro theme,  agregamos esto para hacer referencia a las paginas de control de sesión.

  <div id="menu">
    <ul>
      <li><a href="<%=Utils.AbsoluteWebRoot %>" rel="home"><%=Resources.labels.home %></a></li>
      <li><a href="<%=Utils.AbsoluteWebRoot %>archive.aspx" ><%=Resources.labels.archive %></a></li>
      <li><a href="<%=Utils.AbsoluteWebRoot %>contact.aspx" ><%=Resources.labels.contact %></a></li>
      <li><a href="<%=Utils.FeedUrl %>" class="feed"><img src="<%=Utils.AbsoluteWebRoot %>pics/rssButton.gif" alt="Feed" /><%=Resources.labels.subscribe %></a></li>
      <%
          if (Page.User.Identity.IsAuthenticated)
          {
           %>
      <li><a href="<%=Utils.AbsoluteWebRoot %>logout.aspx">Log out</a></li>      
      <%}
          else
          {
             %>      
       <li><a href="<%=Utils.AbsoluteWebRoot %>login.aspx">Log in</a></li>
      <%   } %>
    </ul>
  </div>