martes, 26 de mayo de 2009

Objetos anónimos como diccionarios

¡Hola!

Cada vez más existen frameworks y librerías que permiten usar objetos anónimos como si de diccionarios se tratase. Esto es muy cómodo porque permite realizar llamadas tal y como:

Foo(new { x = 10, y = 20, Data = "Data" });



Por ejemplo, en ASP.NET MVC no se paran de hacer llamadas parecidas a esta…



Internamente el método Foo utilizará reflection para iterar sobre las propiedades del objeto anónimo que recibe y obtener los datos.



Si tenéis varios métodos que trabajan con IDictionary<string, T> y queréis que se puedan llamar fácilmente usando esta técnica podéis crear un método extensor de IDictionary<string, T> que rellene un diccionario a partir de las propiedades de un objeto… De acuerdo, vuestros métodos no serán invocables directamente pasándoles un objeto anónimo pero al menos los diccionarios se crearán mucho más fácilmente.



Si estáis vagos aquí tenéis un código que uso yo para esto:



public static class DictionaryStringStringExtensions
{
public static IDictionary<string, T> FillFromObject<T>(
this IDictionary<string, T> dictionary,
object values)
{
if (values == null) return dictionary;

Type type = values.GetType();
foreach (var property in type.GetProperties())
{
if (!dictionary.ContainsKey(property.Name))
{
object propValue = property.GetValue(values, null);
T finalValue = default(T);
if (property.PropertyType.Equals(typeof(T)))
{
finalValue = (T)property.GetValue(values, null);
}
else
{
finalValue = (T)Convert.ChangeType (propValue,
typeof(T), CultureInfo.CurrentCulture);
}
dictionary.Add(property.Name, finalValue);
}
}

return dictionary;
}
}



El método realiza conversiones básicas entre tipos de propiedades… Así podeis inicializar fácilmente vuestros diccionarios:



var d = new Dictionary<string, int>();
d.FillFromObject(new { col = "10", row = 20.2 });



Saludos!



PD: Pues sí… esto es ooooootro crosspost desde mi blog de geeks.ms! ;-)

miércoles, 20 de mayo de 2009

ASP.NET MVC y Custom Http Handlers

Hola! ¿Como va todo?

Un post rapidito… Imaginad que creais un Custom Handler para procesar determinadas peticiones en vuestra aplicación ASP.NET MVC:

    public class CardImagesHandler : IHttpHandler
    {
        #region IHttpHandler Members
        public bool IsReusable
        {
            get { return false; }
        }
        public void ProcessRequest(HttpContext context)
        {
            // ...
        }
        #endregion
    }


Luego, lo añadís en el web.config, para que os procese todas las URLs con extensión .portrait:



<add verb="GET" path="*.portrait" 
type="WofWeb.Code.CardImagesHandler"/>


Finalmente probáis alguna URL con extensión portrait, tal y como http://localhost:8080/prueba.portrait i veis que vuestro Custom Http Handler es vilmente ignorado…



¿Por qué? Pues porque ASP.NET MVC toma control de todas las URLs, por lo que intentará procesar esta URL aunque hayamos definido un Custom Http Handler para ella. ¿La solución? En la tabla de enrutamiento indicar que queremos que se ignoren las URL con .potrait, de esta manera serán procesadas por nuestro Custom Http Handler…



… tan sencillo como añadir:



routes.IgnoreRoute("{resource}.portrait/{*pathInfo}");


en global.asax donde configuremos la tabla de enrutamiento!



Saludos!



PD: Este post es un crosspost desde mi blog de geeks.ms!

jueves, 14 de mayo de 2009

Surface en raona...

Hola! En raona tenemos desde hace algún tiempecillo la Surface... Lo que os quiero mostrar no es nada más que un pequeño vídeo de una aplicación que hemos desarrollado para ella: el Surface Shooter.

¿Y que es? Pues como bien se encarga de explicar mi compañero Juan Carlos Viñas permite navegar por los documentos de un portal de sharepoint usando la Surface.

Os dejo el enlace al youtube donde está el video:

Video Raona Surface Shooter (youtube)

En raona pensamos que la Surface ofrece grandes oportunidades, tanto a clientes como a proveedores, aunque es cierto que es necesario que nos olvidemos de todos los conceptos que tenemos preconcebidos en cuanto a como debe ser presentada una interfaz gráfica (os recomiendo que os leais este enorme post del no menos grande Miguel: Microsoft Surface: Developing NUI Touch Experiences).

Un saludo a todos!!! :)

PD: Este post es crossposting desde mi blog en geeks.ms!