Etiqueta: Visual Studio.NET
Patrones de diseño Singular (Singleton) y Decorador (Abstract o Decorator) en .NET
por José Jorge Márquez Gómez a nov.24, 2009, bajo General, Medio
Bueno, después de mi letargo (siento mucho no postear antes, pero la universidad me tenia tiene agobiado), voy a hablar de algunos patrones de diseño sobre .NET.
Pero antes un poco de “historia”:
Los patrones de diseño sirven para varias cosas, (extraído de wikipedia):
* Proporcionar catálogos de elementos reusables en el diseño de sistemas software.
* Evitar la reiteración en la búsqueda de soluciones a problemas ya conocidos y solucionados anteriormente.
* Formalizar un vocabulario común entre diseñadores.
* Estandarizar el modo en que se realiza el diseño.
* Facilitar el aprendizaje de las nuevas generaciones de diseñadores condensando conocimiento ya existente.
Y como bien dicen en wikipedia no pretenden imponer nada y abusar de los mismos puede ser un error.
Bien veamos algunos patrones en .NET.
Patron Singular (Singleton):
Este patrón nos asegura que solo haya una instancia por clase evitando así consumos excesivos de recursos o accesos inconsistentes. Sus usos pueden ser varios, entre ellos el acceso a configuraciones globales, de logging, etc..
El esquema general sería:
Public Class PatronSingular Private Shared instanciaUnica As PatronSingular Private Sub New() 'constructor privado para generar la instancia la propia clase End Sub Public Shared Function getInstance() As PatronSingular 'controlamos la creacion de objetos desde la propia clase. If instanciaUnica Is Nothing Then instanciaUnica = New PatronSingular() End If Return instanciaUnica End Function End Class
Un patrón Singleton su constructor debe ser privado para que sea la clase la controle su propia creación y sea responsable de la misma. Debemos crear un método, que normalmente se llama “getInstance()” que nos devuelve dicha instancia de clase para su uso.
Patrón decorador (Decorator):
Nos hace de “envoltura” de objetos, en una definición formal lo que hace es definir una funcionalidad a los objetos que se hereden de este y asignarles así una responsabilidad. En resumen, nos da la posibilidad de generar clases con funciones que se generen dinámicamente. Hay muchos ejemplos de este tipo en .NET, entre ellos los de manejo de ficheros (FileStream su decorador es Stream). En comparación con JAVA, esto correspondería a las clases abstractas. Ejemplo:
Public MustInherit Class PatronDecorador 'Ofrece una funcionalidad base para todos sus hijos pero 'que funcionen de manera distinta: 'por ejemplo: 'Chocolate tendrá un precio y una descripción distinta que 'la mantequilla, pero ambos se pueden derretir!. Public MustOverride Function Precio() As Double Public MustOverride Function Descripcion() As Double Public Function Derretir() As Boolean 'Derretir Return True End Function 'Obliga que sus hijos se deban instanciar de una forma concreta Public Sub New(ByVal ModificadorAcceso As String) End Sub End Class Public Class Chocolate Inherits PatronDecorador Public Overrides Function Descripcion() As Double Return "Chocolate" End Function Public Overrides Function Precio() As Double Return 10.2 End Function Public Sub New(ByVal param As String) MyBase.New(param) End Sub End Class Public Class Mantequilla Inherits PatronDecorador Public Overrides Function Descripcion() As Double Return "Mantequilla" End Function Public Overrides Function Precio() As Double Return 3.6 End Function Public Sub New(ByVal param As String) MyBase.New(param) End Sub End Class
Bueno, espero escribir más a menudo, pero el tiempo me tiene ahogado!!, en otro artículo intentaré describir los patrones estrategia, adaptadores y observadores. Saludos!!!
Forzar cambio de idioma en ASP.NET
por José Jorge Márquez Gómez a abr.28, 2009, bajo General, Medio
Bueno, para comenzar diremos que los estándares admitidos por .NET para los idiomas los podéis ver en la MSDN http://msdn.microsoft.com/es-es/library/system.globalization.cultureinfo(VS.80).aspx, deciros tambíen que la cultura en un WebForm se establece automáticamente por cada sesión de usuario que se inice en el web, dependiendo del idioma que esté configurado en el navegador del cliente.
Ahora nos surge el problema de forzar el idioma a escoger, bien porque nuestra página permite otros idiomas o bien por necesidad intrínseca del funcionamiento de nuestra página. Teniendo en cuenta los estándares mencionados arriba, podemos variar la cultura de nuestra página de la siguiente manera:
Thread.CurrentThread.CurrentCulture = New CultureInfo("es-ES")
Thread.CurrentThread.CurrentUICulture = New CultureInfo("es-ES")
Bien, explico un poco esto, en las lineas podemos ver que vamos a variar la cultura actual del sitio web y la cultura de la interfaz, esto se hace con CurrentCulture y CurrentUICulture, en primera instancia debemos de establecer la cultura principal del programa a través del hilo principal de ejecución del mismo, esto se hace cogiendo este hilo principal, Thread.CurrentThread, y estableciendo la cultura en ese instante.
Otro problema que nos encontramos es que en el momento de cambiar la cultura, podríamos establecer esta cultura en el hilo en el instante que nos apetezca, pero ocurre que la página Webform ya ha establecido su cultura previamente a nosotros cambiarla, ya que hay un procedimiento en un nivel superior de la jerarquia de clases de la Webform que ha hecho este trabajo y ha escogido el idioma previamente. Pues bien, para solventar este problema y que el cambio de idioma lo veamos reflejado en nuestra web en el momento del cambio, hay otra solución, sobrecargar el método “InitializeCulture” de la clase padre “System.Web.UI.Page” de nuestro WebForm, y ahí colocar el código del cambio de cultura, ya que este procedimiento es el que se encarga de inicializar la cultura de nuestra página antes de ser mostrada en el cliente. Esto quedaría así:
Protected Overrides Sub InitializeCulture()
Thread.CurrentThread.CurrentCulture = New CultureInfo("es-ES")
Thread.CurrentThread.CurrentUICulture = New CultureInfo("es-ES")
End Sub
Bueno, y esto abre a la imaginación tanto como os apetezca, por cierto en el valor “es-ES” se pueden poner todos los valores aceptados por este método descrito en la web de arriba. Así que ya podeís cambiar el idioma de vuestra web “cuando os apetezca”
.
Saludos!
CLR (Common Languaje Runtime)
por José Jorge Márquez Gómez a abr.13, 2009, bajo General, Principiante
Bien, en este post voy a intentar explicar que es el CLR de NET Framework, para mí, y para mi opinión personal el CLR es una maquina virtual al mismo estilo que JVM para java, es la máquina virtual donde se ejecuta el bytecode de los ensambladores generados en .NET. Los compiladores de lenguajes .NET se encargan de compilar el código a bytecode MSIL (Microsoft Intermediate Languaje), que es el interpretado por el CLR.
El CLR compila por bloques el código MSIL en tiempo real, es decir, conforme se vayan usando las funcionalidades del ensamblado, el CLR generará un código nativo que es el que finalmente se ejecutará en la máquinal, así se intenta abstraer el código creado en la máquina bajo cualquiera de los lenguajes usados en .NET del código máquina.
CLR se divide por capas en su núcleo, para dar más interoperabilidad con el sistema y los desarrolladores. Estos son:
- Niveles de seguridad.
- Manejo de excepciones.
- Administración de hilos.
- Administración de memoria.
- Recolector de basura (GAC)
Destacar que a pesar que es una “maquina virtual” el CLR solo se ejecuta en entornos Windows.
Adjunto una pequeña imagen explicativa del CLR (Autor: Leif Arne Storset, Fuente: Wikipedia):

Es un post pequeño pero creo que explicativo a pequeños rasgos. Saludos!
Uso de nomenclatura Using
por José Jorge Márquez Gómez a abr.01, 2009, bajo General, Medio
Deciros que la nomenclatura using es muy útil usarla cuando usamos recursos que debemos liberar forzosamente (acceso a fichero, aperturas de registro en bd’s, manipulación de imágenes…etc) para no tener problemas despúes.
Como nomenclatura de visual studio es muy usada para el acceso a ficheros, pero es posible usarse con cualquier clase que implemente la interfaz IDisposable, asegurándonos que la clase usada en el estamento using liberará “SI o SI” (como dice un presidente de un club de futbol
) los recursos que esté usando, dé error en el bloque de código o no, ya que es el Garbage Collector del visual studio el que se encarga de llamar a el método dispose de la clase que implementa la interfaz.
Para este ejemplo usaremos el acceso a un fichero.
El ejemplo es sencillo, ya que lo único que debemos hacer es usar la nomenclatura de este modo:
Using fich As New FileStream("C:\pruebas.txt", FileMode.Open)
'CODIGO A ESCRIBIR PARA MANEJAR EL FICHERO
End Using
De este modo nos estamos asegurando que el fichero pruebas.txt será liberado cuando termine el bloque using, sin provocar problemas en posteriores accesos al fichero.
Hay casos, como por ejemplo, el acceso a datos que al declarar el bloque nos obliga a abrir dicha conexión dentro del bloque, con esto quiero decir, que no por crear el bloque using ya damos por hecho que el recurso se abre y se cerrará solo (esto último sí es cierto). Lo que damos por hecho es que en el caso del ejemplo anterior si se abrirá el archivo porque la clase FileStream en su constructor ya abre el recurso, pero en el caso de una conexion de datos el constructor de dicho conector de datos no abre la conexion en su constructor, con lo cual debemos abrirlo una vez asignado el recurso.
Ejemplo:
'ESTA DECLARACIÓN NO IMPLICA LA APERTURA DE LA CONEXIÓN SOLO LA INICIALIZACION DEL OBJETO
Using conn As New SqlConnection("CadenaConexion")
conn.Open() 'Esto si nos asegura su apertura, ya el bloque using se encargará de liberarlo (cerrar la conexión)
'CODIGO A ESCRIBIR
End Using
Resumiendo,
Lo que si nos aseguramos con un bloque using es la liberación de recursos, pero no la apertura de esos recursos, esto dependerá de la clase usada en el using.
Crear blibliotecas de clases que se registren en el COM de Windows
por José Jorge Márquez Gómez a mar.30, 2009, bajo General, Medio
Yo estuve un tiempo buscando como registrar una DLL en el COM para la interoperabilidad con ASP 3.0, PHP, etc.. bueno despues de buscar y buscar, investigar, romperme los ojos… etc… era más simple de lo que pensaba. Para poder registrar una dll en el COM de windows primero debemos definir la clase como visible desde el COM y definirle una key o firma del ensamblado. Se hace de la siguiente manera:
1.- Indicamos al proyecto que sea visible desde el COM.

2.- Creamos la key del proyecto.

Hay que tener en cuenta que a la hora de compilar el ensamblado debemos hacer funciones (procedimientos) que sean “entendibles” por cualquier lenguaje de programación no .net, esto es, usar si se puede, funciones, procedimientos, propiedades, etc.. que devuelvan tipos de datos nativos, así será más facil entender por ASP3.0 por ejemplo, php o cualquier otro. Si un momento dado tu ensamblado posee funciones no compatibles con COM el registro del COM avisará cuando se registre en la máquina (solo si necesita registro para aplicaciones no .NET). Si estos ensamblados se van a usar en .NET solo hay que añadirlos al assembly de windows, esto se hace:
1.- Abrimos una aplicacion consola desde el path de Visual Studio.
2.- Escribimos en la linea de comandos: gacutil -I RUTAENSAMBLADO (Ej. gacutil -I c:\midll.dll)
Si necesitamos interoperabilidad con COM hay que registrar el ensamblado en windows. Se hace: regasm /tlb /codebase RUTAENSAMBLADO (Ej. regasm /tlb /codebase c:\rutadll.dll)
Esto debe mostrarte un mensaje de finalización en ingles como que se ha procedido al registro correctamente, en el caso que hubiera alguna incompatibilidad (como hemos comentado antes) de tipos de datos no compatibles con COM, se verá como en este paso la aplicación regasm lo mostrará.
Bueno, después de escribir este tocho “como mi primr HOLA MUNDO”
del blog. Espero que lo veáis util y hagamos de esto un blog con bastantes post para ayudar…. un saludo!!






