Los métodos extensores.

Los métodos extensores, nos permiten “extender” la funcionalidad de una clase sin que sea necesario usar herencia o polimorfismo pudiendo añadirle funcionalidad a clases “core” del Framework.

Hay que tener en cuenta, que estos métodos aunque son muy útiles, en ningún caso pueden sustituir a la herencia de clases.

Para crear un método extensor, necesitamos un código tal como el siguiente:

public static string ToMD5(this string str)
{
MD5 md5 = MD5CryptoServiceProvider.Create();
ASCIIEncoding encoding = new ASCIIEncoding();
byte[] stream = null;
StringBuilder sb = new StringBuilder();
stream = md5.ComputeHash(encoding.GetBytes(str));
for (int i = 0; i < stream.Length; i++) sb.AppendFormat("{0:x2}", stream[i]);
return sb.ToString();
}

Como veis, el metodo extensor, ha de ser estático y ademas, va a recibir siempre como parametro el objeto que lo llama, a este objeto tenemos que añadirle el parametro this.

Así de facil y sencillo. Este tipo de metodos, los había usado con JavaScript y ActionScript, y ahora, mis drugitos, los podemos usar con C#, toda una maravilla.

Bajate el código y échale un ojo, y cuando uses este tipo de metodos, cuidado, ten en cuenta que no estan pensandos para sustituir la funcionalidad que nos proporciona la herencia, y como bien dicen aquí, es interesante agruparlos en un mismo namespace (que en una única clase).

Nunca han sido santos de mi devoción los planetas, aunque desde hace unos días, no paro de escuchar su “corrientes circulares en el tiempo”, canción mucho más madura que la mayoría de sus exitos.

Anuncio publicitario

La herencia de web.config y los deployment.

Es interesante ver como por norma general e independientemente del paso del tiempo, los deployment han sido y son tareas que sin tener porque, se complican y llegan a rayar lo absurdo.

Generalmente cuando estamos en un proyecto, disponemos de distintos entornos, conforme vamos avanzando en el ciclo de vida del desarrollo del software, vamos desplegando la aplicación en el entorno de desarrollo, preproducción etc. y en el momento que tenemos que poner la aplicación en producción siempre surge alguna cosa.

Si el proyecto en el que nos encontramos trabajando es muy grande, es una buena práctica partirlo en porciones más pequeñas, así podemos trabajar de una forma más desacoplada y posteriormente el deployment también podemos conseguir que sea más sencillo.

Supongamos que estamos en un proyecto que es muy grande, y que en este momento, estas desarrollando pequeñas piezas, que sin formar parte del core del negocio que intenta resolver, lo complementa.

Una buena solución es trabajar en distintas soluciones de manera que una funcionalidad x la tienes totalmente encapsulada en la solución que le corresponde. Y así, cuando llega el momento de hacer el deployment, puedes desplegar el core de tu negocio en un Web Site, y todas las aplicaciones satélites pueden ser virtual directories dentro de tu web site principal.

A la hora de hacer el deployment, cuando tenemos un Web Site que contiene n directorios virtuales, podemos observar como el web.config de los directorios virtuales, heredan del web.config del Web Site, de esta manera, puedes dejar toda la configuración común de tu app en el web.config de la aplicación que implementa el core de tu negocio, y toda la configuración de tus aplicaciones satélites en el web.config de cada una de ellas (en su respectivo virtual directory), así consigues tener la configuración de cada pieza aislada y más controlada.

Seguramente esta práctica, genera un trabajo de configuración y mantenimiento mayor, pero merece la pena por el hecho de tener todo más aislado y desacoplado.

Hoy mientras escribía este post, he estado escuchando a Ticket, el grupo de mi colega Maiki, ya que mañana tocan aquí en Madrid.

Como posicionar Objetos en pantalla cuando trabajamos con Silverlight.

Tiempo hace que desarrollamos en la web, y por eso, nos hemos acostumbrado a ir posicionando objetos en función de un Layout que resulta de la aplicación de estilos css a elementos HTML. Cuando hemos trabajado con flash (o con algún Windows Form), posicionar objetos, es más sencillo, ya que simplemente tenemos que aplicarles unas coordenadas, posicionando estos objetos de forma absoluta.

Ahora que tenemos que aprender Silverlight (o Moonlight los linuxeros), con uno de los primeros problemas que nos vamos a encontrar, es con el posicionamiento de los elementos en pantalla. No os asustéis, porque no es muy complicado, pero sí que es verdad que tenemos varias opciones donde elegir, las cuales vamos a ver en breve.

Posicionando elementos en pantalla.

Silverlight, para permitirnos posicionar los elementos en pantalla de una forma flexible, nos proporciona tres controles:

  • StackPanel
  • Canvas
  • Grid

Estos 3 elementos, nos van a permitir, posicionar otros elementos de formas más bien distintas.
Los 3 heredan de la clase Panel, y ahora vamos a ver con que funcionalidad nos fortalecen o penalizan cada vez que usemos uno de ellos.

El StackPanel.

El StackPanel, es el más sencillo de los tres, nos permite posicionar varios elementos, uno a continuación de otro y en dirección horizontal o vertical.

El código XAML necesario es el siguiente: Sigue leyendo

Dependency Properties y Attached Properties, ¿Qué son?

Cuando estas empezando a aprender Silverlight o Windows Presentation Foundation (aka WPF) y las tecnologías lo hacen posible como por ejemplo XAML, empiezas a encontrar algunos conceptos nuevos que ha introducido ASP.NET 2008 y el Framework 3.5.

WPF, introduce un nuevo uso de las propiedades mucho más inteligente y sofisticado, estas son las Dependency Properties y las Attached Properties, dos tipos nuevos de propiedades (o un tipo y medio por lo menos) que nos proporciona el Framework y que nos vamos a cansar de usar cuando nos toque crear interfaces (y lo que no son interfaces) con XAML.

Dependency Properties

Una Dependency Property, es un tipo especial de propiedad que devuelve una propiedad .NET y además el valor de la susodicha Dependency Property, depende de otros elementos, por eso no es suficiente con una propiedad normal.

Las características de las Dependency Properties son: Sigue leyendo

Combinando scripts para mejorar el rendimiento de nuestras aplicaciones web gracias a la característica CompositeScript del ScriptManager.

Con el Service Pack 1 de Visual Studio 2008, se han incluido muchas novedades como ya vimos, pero para trabajar con Ajax, este Service Pack incluía dos mejoras bastante interesantes:

  • Historial con ASP.NET Ajax.
  • Soporte para combinar ASP.NET Ajax Scripts.

Hoy veremos cómo combinar scripts y que ganamos al hacerlo.

¿Qué ganamos combinando varios archivos Javascript en uno?

Por razones muy diversas, puede ser recomendable que tengamos nuestra funcionalidad cliente en varios archivos de Javascript. Eso si esta practica también tiene consecuencias de cara al rendimiento de nuestra aplicación.

Actualmente cuando un navegador Web comienza a realizar peticiones para servir el contenido de una página, estas peticiones se van procesando de manera que nunca se estén sirviendo más de 4 peticiones simultaneas, que sucede que cuantas más peticiones, más lento es el proceso de carga de una página.

Así pues, como podemos deducir, hay veces que es preferible tener menos peticiones web y archivos más grandes que muchísimos pequeños y muchas peticiones web.

Como combinar scripts.

Gracias a CompositeScript, nueva funcionalidad del ScriptManager que viene con el Service Pack 1 de Visual Studio 2008 y del Framework 3.5 esto, es sumamente sencillo. Sigue leyendo

El Control ScriptReferenceProfiler.

Como ya hemos vistos en algunos post anteriores el control ScriptManager de Microsoft se traduce en una serie de archivos javascript que son necesarios para trabajar con Ajax, de forma similar, los controles “extender” (como por ejemplo los del AjaxControlToolKit) que nos permiten añadir funcionalidad Ajax a algunos controles de servidor también añaden algunos archivos javascript.

El control ScriptReferenceProfiler, nos va a mostrar en todo momento que archivos javascript (de “sistema”) se están añadiendo a nuestra página. Esto nos puede resultar muy útil a la hora de “afinar” nuestras aplicaciones web.

Este control se puede descargar de forma gratuita desde el sitio de codeplex.

Para usarlo, tan simple como esto: Sigue leyendo

Linq: Los Operadores OrderBy y OrderByDescending.

Anteriormente ya hablamos de varios operadores de linq y ahora volvemos al tema para ver dos nuevos operadores que seguramente son de los más usados.

Para los que no sepan que es linq, les recomiendo leer ¿Qué es linq?, para los demás sigamos adelante.

En este post, vamos a ver dos operadores y como he dicho seguramente van a ser de los más usados, estos son:

  • OrderBy
  • OrderByDescending

Como su nombre indica, estos operadores, lo que nos van a permitir es ordenar el conjunto de datos de forma ascendente (OrderBy) o descendente (OrderByDescending).

Antes de meternos en faena, decir que vamos a usar como fuente de datos un xml con información sobre países, el mismo que usamos en el post “Operadores de Linq: Como usar los operadores Take, StartsWith, EndsWith y Contains”.  El xml tiene este aspecto: Sigue leyendo

Trabajando con Ajax y las Microsoft Ajax Library (ScriptManager, UpdatePanel etc…) e IFrames: Como resolver el error «Access Denied».

No es extraño, encontrarse con escenarios de integración de aplicaciones (hablamos de aplicaciones Web) donde tenemos que integrar nuestras apps con aplicaciones de terceros.

Una solución muy extendida, es hacerlo con la ayuda de IFrames, donde en el cargamos nuestra aplicación en un sitio de terceros, de manera que la aplicación de terceros (donde integramos la nuestra) está en un servidor y nuestra aplicación esta en otro servidor.

Si nuestra aplicación, está trabajando con Ajax (y con ScriptManager, UpdatePanel etc…), seguramente cuando la ejecutemos en Internet Explorer (solo lo he probado con IE7 aunque tengo sospechas de que ocurrirá también con IE6) vamos a recibir un error cuya descripción es “Access Denied”.

¿Qué es el ScriptManager?

El ScriptManager, es un control de servidor que nos proporciona el Framework que nos va a gestionar  la descarga de los archivos necesarios de JavaScript  para poder trabajar con Ajax de forma sencilla.

Además, el ScriptManager, también inicializa valores del JavaScript etc… Así que tendremos que estar pendientes del uso que estamos haciendo de este para poder replicar su comportamiento.

¿Qué produce el error?

El error, lo produce la función getLocation del archivo MicrosoftAjax.js. El archivo MicrosoftAjax.js es uno de los que nos descarga el ScriptManager.

La función getLocation determina las coordenadas relativas de un pixel de un elemento del DOM respecto a la esquina superior izquierda del navegador. Como los distintos navegadores, esto lo calculan de distinta forma, esta función hace distinción del browser (algunos tienen en cuenta el scroll otros no etc…) que está ejecutando la página (he aquí la razón por la que únicamente falla en Internet Explorer) así que nos encontramos con que la parte de código que calcula las coordenadas para Internet Explorer, no lo hace demasiado bien.

¿Cómo solucionar el error?

Pues bien, dado que tenemos localizada la razón por la que se produce el error, la solución es sencilla, tenemos hacer un wrapper del código que produce el susodicho error. Sigue leyendo

Ordenando un GridView mediante el evento Sorting (El GridView y sus eventos: El evento Sorting)

Una de las operaciones típicas a realizar con un GridView, es ordenar la información que muestra, ahora vamos a ver como hacerlo mediante el evento Sorting, cuando se ejecuta, cual es su finalidad y que es lo que nos aporta.

Tengo que decir tambien, que junto con el evento RowDataBound para manipular la información antes de hacer el binding y el evento PageIndexChaning para paginar el GridView, este es uno de los más usados.

Como ya hemos visto anteriormente el GridView es un control que nos proporciona ASP.NET cuya funcionalidad es “trabajar” con información tabular. Seguramente es uno de los controles más usados y a lo lardo de las distintas versiones de Visual Studio, ha cambiado el nombre, pero siempre se ha mantenido. Este control, es muy pesado y consume gran cantidad de memoria pero aporta mucha funcionalidad que muchas veces no llegamos a aprovechar porque generalmente lo usamos para mostrar información (entendamos que hablo de aplicaciones Web).

Este post forma parte de una serie de post llamada El GridView y sus Eventos. Los post que forman esta serie y que si has llegado aquí te pueden interesar son:

El evento Sorting.

El control GridView, como vamos viendo tiene mucha funcionalidad implementada, y parte de esta, es la  capacidad de ordenación de sus resultados, lo cual es muy útil. El evento Sorting, salta cada vez que pulsamos en un link de ordenación, pero antes de que se haya realizado la susodicha ordenación. Sigue leyendo

El GridView y sus eventos: El evento PageIndexChanging

En este post, vamos a ver el evento PageIndexChanging del GridView. Vamos a ver cuando se ejecuta, cual es su finalidad y lo que nos aporta.

El GridView es un control que nos proporciona ASP.NET cuya funcionalidad es “trabajar” con información tabular. Seguramente es uno de los controles más usados y a lo lardo de las distintas versiones de Visual Estudio, ha cambiado el nombre, pero siempre se ha mantenido. Este control, es muy pesado y consume gran cantidad de memoria pero aporta mucha funcionalidad que muchas veces no llegamos a aprovechar porque generalmente lo usamos para mostrar información (entendamos que hablo de aplicaciones Web).

Este post forma parte de una serie de post llamada El GridView y sus Eventos. Los post que forman esta serie y que si has llegado aquí te pueden interesar son:

El evento PageIndexChanging.

El GridView, nos aporta la posibilidad de poder paginar los resultados pudiendo así mostrar cada vez un conjunto de registros. Esto lo conseguimos, si le seteamos a true la propiedad AllowPaging, y también podemos indicarle el número de registros que queremos mostrar cada vez (por defecto, si no recuerdo mal es 10) por medio de la propiedad PageSize. Sigue leyendo