jueves, 25 de marzo de 2010

Guia de arquitectura

Algunos de vosotros ya conocereís o habreis oido hablar del centro de arquitectura que tiene Microsoft, en el podemos encontrar interesantes articulos explicando algunos patrones de diseño y sus implementaciones en .net asi como diferentes guias y herramientas (http://msdn.microsoft.com/es-es/architecture/default.aspx). Pero lo que quiero compartir con todos vosotros es una guia que han publicado recientemente sobre la "Arquitectura N Capas DDD .Net 4.0". El documente (todavia esta en fase de borrador) según sus propios creadores nace como respuesta a una necesidad que han detectado. "Microsoft Ibérica ha detectado en diversos clientes la necesidad de disponer de una “Guía de Arquitectura base .NET” en español, que sirva para marcar unas líneas maestras de diseño e implementación a la hora de desarrollar aplicaciones .NET complejas."

En definitiva se trata de un buen documento que deberia ser leido por cualquiera que este interesado en desarrollar software de calidad con una arquitectura bien definida y que aproveche todos los elementos que el nuevo framework 4.0 nos ofrece.

martes, 16 de marzo de 2010

Enumerados con valores de tipo cadena C#

Fuera de toda duda estan las ventajas de utilizar enumerados en nuestro código, pero en ocasiones es necesario asociar el valor del enumerado con una cadena, en .Net no se permiten enumerados con valores númericos pero... hace tiempo encontre una solución que ahroa voy a presentar.
/// 
    /// Se crea una clase que hereada de Attribute
    /// esta clase almacenara el string con el valor
    /// del enumerado
    /// 
    public class StringValueAttribute : Attribute {

        #region Properties

        /// 
        /// Holds the stringvalue for a value in an enum.
        /// 
        public string StringValue { get; protected set; }

        #endregion

        #region Constructor

        /// 
        /// Constructor used to init a StringValue Attribute
        /// 
        /// 
        public StringValueAttribute(string value) {
            this.StringValue = value;
        }

        #endregion

    }
Ahora es necesario crear un Método de extension para poder obtener el string asociado al valor del enumerado.
/// 
        /// Se obtiene la cadena asociada
        /// a un valor concreto del enumerado,esto solo funciona 
        /// si se ha asignado previamente un valor al atributo StringValue
        /// 
        /// 
        /// 
        public static string GetStringValue(this Enum value) {
            // Get the type
            Type type = value.GetType();

            // Get fieldinfo for this type
            FieldInfo fieldInfo = type.GetField(value.ToString());

            // Get the stringvalue attributes
            StringValueAttribute[] attribs = fieldInfo.GetCustomAttributes(
                typeof(StringValueAttribute), false) as StringValueAttribute[];

            // Return the first if there was a match.
            return attribs.Length > 0 ? attribs[0].StringValue : null;
        }
Ahora vemos como crear un enumerado
 public enum MyEnum: int {
        [StringValue("Lun")]
        Lunes= 1,
        [StringValue("Mar")]
        Martes = 2       
 } 
Como parte final vemos como usar nuestro enumerado.
MyEnum myE = MyEnum.Lunes;
string val = myE.GetStringValue();

lunes, 22 de febrero de 2010

Mantener la posicion de un Div después de un postback asíncrono

Cuando queremos mantener la posición del scroll de un elemento como puede ser un Div ó un Panel despues de una postback asíncrono, tenemos que recurrir de nuevo al potente javascript. Parece claro que lo que tenemos que lograr es almacenar la posición del scroll antes del postback y después restaurlarla. Eso es exactamente lo que hace el siguiente script. Es importante que este situado siempre después del ScriptManager.

Lo que hacemos es añadir dos manejadores BeginRequestHandler y EndRequestHandler, el primero se ejecuta justo antes de realizar el postback, en él obtenemos la posición del scroll y la almacenamos, en el segundo restauramos esa posición.

sábado, 30 de enero de 2010

Novedades Asp.Net 4.0 parte II

En este post vamos a continuar tratando algunas de las novedades de Asp.Net 4, es este caso quiero comentaros la nueva forma de gestionar y controlar la cache.

Output cache

Con la aparición de la primera versión de asp.net se introdujo el concepto de output cache, esto permite a los desarrolladores almacenar páginas, controles y las respuestas Http en la memoria de forma que las siguientes peticiones Web, asp.net puede servirlas de forma mucho más rápida y eficiente ya que solo tiene que acudir a la memoria y coger el código genera anteriormente para la página, editándose así una nueva generación del código de salida de la página.

Asp.Net 4 añade un punto más a esta funcionalidad permitiendo al desarrollador añadir uno o varios proveedores personalizados de output-cache. Estos proveedores (providers) permiten usar cualquier mecanismo de almacenamiento para persistir el código HTML. Esta nueva funcionalidad permite al desarrollador crear diversos providers en función del tipo de almacenamiento que precise en cada situación (discos remotos o locales, almacenamiento en la nube, motores de cache distribuida), combinandolos a su gusto.

Para crear un Cache provider personalizado debemos crear una clase y heredar de System.Web.Caching.OutputCacheProvider. Una vez creado el nuevo proveedor de cache tendremos que dar un paso mas para poder utilizarlo, este paso ya os lo podréis imaginar... si, tenemos que configurarlo en el Web.config, para ello, dentro de la sección de providers se ha creado una nueva subsección llamada outputcache. El siguiente fragmento de código nos muestra la sección de un web.config en el que se configura la cache para que se almacene en memoria. Este es el tipo de almacenamiento que se usa por defecto Asp.net 4.








Ademas de esto, podemos añadir un mayor nivel de detalle especificando a nivel de control o de petición. La manera mas sencilla de configurar un nuevo proveedor para un Control se usuario es utlizando la sintaxis declaratia. Para ello se ha creado un nuevo atributo llamado providerName, a continuación vemos como como utilizarlo

<%@ OutputCache Duration="60" VaryByParam="None" providerName="DiskCache" %>

Si por el contrario lo que queremos es configurar un proveedor difirente dependiendo de la página que se vaya a solicitar tendremos un poco más de trabajo. Es necesario sobreescribir el método GetOuputCacheProviderName en el Global.asax para especificar manualmente que proveedor corresponde con cada petición de página.


public override string GetOutputCacheProviderName(HttpContext context) 
{ 
  if (context.Request.Path.EndsWith("Advanced.aspx"))
    return "DiskCache"; 
  else
    return base.GetOutputCacheProviderName(context);
}

Después de ver de forma muy resumida esta nueva caracteristica que nos ofrece asp.net a cada desarrollador se le pueden ocurrir algunas situaciones en las que podremos sacar provecho de esto, por ejemplo podemos combinar los distintos tipos de proveedores para conseguir accesos mas rápidos almacenando las páginas mas visitadas en memoria y aquellas que lo son menos en disco.

lunes, 11 de enero de 2010

Visual Studio 2010, Retrasado.

Parece ser que vamos a tener que esperar un poco más para tener en nuestras manos la versión definitiva del Visual Studio 2010 y del Framework 4. Según la propia compañia este retraso se debe a que "El feedback recibido denotan que el rendimiento y el uso de la memoria virtual en VS2010 no es el adecuado para la nueva versión". Microsoft ha decidido ofrecer una versión Release Candidate (RC), la cual estara disponible en Febrero. La RC vendra con una licencia "go live" que soportora despliegue de aplicaciones en producción, "El objetivo de esta RC es obtener todo el feedback sobre el producto. Para asegurarnos que somos capaces de recibir todo el feedback y reaccionar a el, hemos decidido retrasar unas semanas el lanzamiento de VS2010 y el Framework 4".

miércoles, 30 de diciembre de 2009

Novedades Asp.Net 4.0

Estos días en los que el trabajo nos da un poco mas de respiro me he decidido a revisar algunas de las novedades que vamos a poder disfrutar con el lanzamiento de la nueva versión del Framework y del Visaul Studio 2010. Este es el primero de una serie de post en los que iremos viendo algunas novedades que afectaran a los desarrolladores que trabajen con ASP.NET Web.Config Limpios A lo largo de las distintas versiones de asp.net el fichero de conflagración ha ido creciendo, incorporando nuevas características como Ajax, routing o la interacción con IIS. Este aumento nos genere un fichero mucho mas grande y menos legible (el fichero web.config que se añade en un nuevo proyecto en el Visual Studio 2008 sp1 ocupa alrededor de 126 lineas), resulta bastante complicado modificar dicho fichero sin una herramienta como Visual Studio. Pero todo esto ha cambiado en la nueva versión, ahora cuando creemos un nuevo proyecto asp.net 4.0 podremos observar un web.config como este: Esto es posible gracias a que la mayoría de los elementos de conflagración han sido movidos al fichero machine.congif de forma que ahora las aplicaciones heredan del mismo. Esta novedad no aporta funcionalidad alguna pero si permite mayor legibilidad del código que teniendo en cuenta la cantidad de información que tenemos que manejar no es poco. Feliz año nuevo a todos, menos framework y mas Champagne!!

jueves, 3 de diciembre de 2009

Cache de Objectos .Net: Applications Block

Hoy quiero hablar sobre la utilización de la cache en las aplicaciones Asp.net, cuando nos encontramos ante una aplicación que hace numerosas consultas a la base de datos y la mayoría de estas consultas no cambia habitualmente, nos encontramos ante un entorno perfecto para usar la cache. Las ventajas de cachear objetos son obvias, nos permite reducir los tiempos de respuesta de las aplicaciones ya que reducen el número de consultas a la base de datos y esto al final supone la mayoría del tiempo de procesamiento de una página. Llegado este punto en el que tenemos claro que queremos que nuestra aplicación use la cache, debemos decidir dónde vamos a utilizarla y qué vamos a cachear.
Output Cache a nivel de página
Es la forma mas simple de cache, mantiene una copia del HTML que ha sido enviado como respuesta.
Fragment Caching y user controls
Esta técnica se utiliza cuando solo queremos cachear determinadas partes de la página. Estas partes se encapsulan dentro de controles de usuario y luego se marcan con la directiva @OutputCache, indicando el tiempo que se mantendrá el control en memoria.
Caching API, usando el Objeto Cache
Utilizando el objeto cache puedes almacenar cualquier objeto serializable, permite controlar la expiración del objeto en función de varios parámetros, tiempo transcurrido desde su creación, modificación del objeto, modificación del otros objetos, cambios en tablas de la base de datos, ...
Applicattions Block
"Application Blocks son pequeñas (ahora no tan pequeñas) partes de la aplicación, en general bastante necesarias para el desarrollo de aplicaciones corporativas. Se pueden encontrar ejemplos de dichos Application Blocks en http://www.microsoft.com/resources/practices/code.mspx."
Para usas estos bloques de código es necesario instalar el Enterprise Library, una vez instalado ya podremos empezar a configurar la cache, aunque funciona sin necesidad de modificar nada en la configuración.
Este application block soporta la cache en memoria y en almacenamientos de soporte (bases de datos o almacenamientos aislados) .
Configuración
Enterprise Library viene con una herramienta de configuración que nos permite cambiar de forma graficas las opciones de los distintos Blocks.
Lo primero que tenemos que hacer es cargar en la herramienta de configuración el fichero de configuración (web.config) del proyecto en el que queremos utilizar la cache. Si habéis almacenado alguna cadena de conexión en el web.config veréis como la herramienta las reconoce y las sitúa dentro del Application Block de Data Access.
A continuación vereis como se ha creado una nueva sección que corresponde a la cache. Para el ejemplo vamos a mantener los valores por defecto, esto es, tiempo cache 60 segundos, número máximo de elementos en cache 1000, cuando se llega al tope se sacaran de la cache 10 elementos. Guardamos los cambios y cerramos la herramienta.
Uso de la cache
1- Añadir namespaces
using Microsoft.Practices.EnterpriseLibrary.Caching;
using Microsoft.Practices.EnterpriseLibrary.Caching.Expirations;
1- Instanciar object CacheManager
CacheManager cacheManager;
cacheManager = CacheFactory.GetCacheManager("MyCacheManager");

//Cache Manager es el nombre que le hemos dado al CacheManger en la herramienta de configuración
3- Cache de objetos
Usuario user = new Usuario("jorge", "españa", "28");
cacheManager.Add(user.nombre, user, CacheItemPriority.Normal, null, new SlidingTime(TimeSapn.FromMinutes(5)));
Con este ejemplo no se intuye la verdadera necesidad de utilizar este Block, pero si imaginamos situaciones en las que necesitemos realizar la cache en la capa de acceso a datos se vuelve un instrumento de gran importancia.