jueves, 16 de mayo de 2013

Sobre expression tree y lambdas




Veamos qué son las Lambda Expression y Expression Tree

Una expresion lambda es basicamente la generalizacion (aún más) de un delegado o metódo anonimo.
Tienen la forma: Func<int,bool> fx=i=>i>0; donde lo que esta a la izquierda de "=>" es el parametro y lo que esta a su derecha es la "expression" evaluada que se devuelve. En este caso la evaluacion es un valor booleano.
Ademas "fx" puede llamarse como un método común y corriente de la forma "fx(23)".

Una expresión lambda es una función o una subrutina sin nombre que se puede utilizar donde haya un delegado válido. Las expresiones lambda pueden ser funciones o subrutinas y tener una sola línea o varias líneas. Pueden pasar valores del ámbito actual a una expresión lambda.

Por otro lado una Expression Tree es simplemente el codigo anterior traducido a un "arbol binario" donde cada nodo es una "expression" y esta es "algo" que se puede evaluar ya sea para generar un valor booleano o numerico o el objeto que sea. Las Expression Tree son el resultado de la "compilacion" de una expression Lambda.

La pregunta que surge es: que tienen de "picante" las lambdas y las expression tree?
Lo bueno es que con las lambdas podemos expresar un comportamiento in-line  dentro de un metodo "verdadero" y sin necesidad de crear otro método aparte.

Cómo se crea un expression tree? Hay dos formas pero vamos a ver la primera por ahora:

Expression<Func<int, bool>> lambda = num => num < 5;

Pero de nuevo, que tienen de bueno las expression tree? Lo bueno es que un arbol asi puede procesarse mucho mas rápido (porque es binario) y de alguna forma su "generacion" no es "unica" sino que diferentes "Proveedores" podrian generar su propio "expression tree" en funcion de su implementacion segun sus fines.
El ejemplo mas facil de entender es el de las expresiones lambda sobre fuentes de datos asociadas a una base de datos real. Las expresiones lambda le decimos en estos casos una "LINQ" y cuando se procesan en tiempo de ejecucion se transforman en un Expression Tree el cual su proveedor puede transformar en una consulta "SQL" entendible por el motor de base de datos que hay debajo.



Un artículo para profundizar más sobre el tema (ingles)


¿Para qué sirve AutoMapper?



Sirver para "mapear" o "traducir" un objeto en otro. Generalmente se usa con los DTOs cuando tenemos un objeto de negocio que queremos presentarlo con un sustituro (es decir un DTO), y para no hacer las interminables asignaciones propiedades por propiedades, usamos Automapper: un framework open que sirve a nuestros fines de "castear" un objeto en otro diferente.

http://automapper.org/

Usando AutoMapper

Sobre las WebApi


¿Qué son?

Las WebAPI (apiRest) significan usar el protocolo HTTP con sus verbos (POST,GET...) para ofrecer servicios (ABM por ejemplo sobre un modelo de datos) en lugar de ofrecer solamente paginas webs. Se acceden mediante una URL a esos "servicios" o "metodos" que hacen una operacion en el servidor.
Por otra parte, en general la forma de intercambiar información entre un cliente y una restAPI es JSON.

//Por desarrollar


Muy bueno este tutorial: http://www.asp.net/web-api

Model-View-Presenter en ASP.NET Webforms

//coming soon

MVC/MVP/MVVM



¿Qué son?

Lo importante de estos patrones que debemos dejar en claro es que son Patrones de Presentación. Aunque suene loco ellos nacieron para "acomodar" (me refiero a la mantenibilidad) lo mejor posible lo que hace a la "visualización" de nuestras aplicaciones. Esto es, desde la presentación para abajo seguirá existiendo otra arquitectura que puede ser la que ya conocemos.
En fin MVP, MVC, MVVM no tienen nada que ver con el negocio en sí, con bases de datos, mensajes ni nada. Solo están para ordenar lo "visual" de nuestro software.

http://geekswithblogs.net/michelotti/archive/2009/10/25/asp.net-mvc-view-model-patterns.aspx

Cómo usar ViewModels en MVC

Model View Presenter en .net (CodeProject)

Ejemplo completo con MVC 3/4

ASP.NET MVC 3 Fundamentals (ejemplo projecto MusicStore)

Ejemplo listado de Peliculas (MVC4)