Wednesday, March 25, 2009

Templates Tipos Genericos Herencia

Cuando estas desarrollando software, es una consecuencia natural el uso de Templates para facilitar la construccion del codigo, ahorrar lineas repetitivas disgregadas en diferentes clases de uso final, y reducir los tiempos.

Si dentro de la construccion de tus clases solo utilizas Templates para hacer un List<String> o a lo mucho un IEnumerable<Client>, ten la plena seguridad que estas desperdiciando el uso favorable de la tecnologia que tienes en tus manos, en este caso C#, de manera irresponsable y muy probablemente estes quemando tus neuronas haciendo el laborioso COPY & PASTE por everywhere...!

Debes cambiar el rumbo, alguien debe girar el timon :)

En ese uso de siniestros Templates, dentro de la definicion de aquellas clases que heredan su comportamiento de otras clases que se han diseñado como Templates, muy probablemente te encuentres con un mensaje como este:

'TEntity' must be a non-abstract type with a public parameterless constructor in order to use it as parameter 'TEntity' in the generic type or method 'SomeClass<TEntity>'

Lo que sucede es que la clase SomeClass presenta una serie de restricciones para su normal ejecucion. Dichas restricciones se implementan con el uso de la clausula where en la definicion de la clase o en los metodos de la misma, que el arquitecto establecio en el diseño de dicha clase.

En consecuencia, al implementar la herencia de una clase que tiene dichas restricciones, solo queda ir de la mano con ella.

En terminos sencillos, tendras que establecer las mismas restricciones haciendo uso de la clausula where en la implementacion de tu nueva clase y agregar otras nuevas que creas conveniente para la construccion de la tuya.

En el caso en concreto del mensaje que te mostre anteriormente, este nos indica que el tipo generico TEntity requiere ser instanciada en alguna parte del codigo de la clase heredable.

Es decir, debes agregar esta restriccion: where TEntity : new() en tu nueva clase.

Monday, March 23, 2009

HTTP Error 404.3 Vista WCF

Cuando intentas hacer el deploy de tu WCF sobre IIS 7 del Windows Vista puede que te encuentres con este mensaje de error:

HTTP Error 404.3 - Not Found
Description: The page you are requesting cannot be served because of the Multipurpose Internet Mail Extensions (MIME) map policy that is configured on the Web server. The page you requested has a file name extension that is not recognized, and is not allowed.


Lo que sucede que es las extensiones .SVC de los EndPoint tu de WCF pues NO se encuentran activados aun para ser reconocidos como peticiones correctas en tu servicio web.

Lo unico que debes hacer es ejecutar la sentencia desde el Command Line: ServiceModelReg -i

Esta permitira que ls SVC puedan ser interpretados y resueltos como esperabas.

El ServiceModelReg se encuentra en el %Windows%\Microsoft.Net\Framework\v3.0\Windows Communication Foundation\

Tuesday, January 27, 2009

Component Services Vista NO esta

Component Services sobre Windows Vista NO esta alli, como antes. Fue sacado, inmisericorde.

Sin embargo, NO debes deprimirte. Menos aun, desesperarte :)

Basta ejecutar comexp.msc para volver a ver la consola de administracion del Component Services.

Friday, January 09, 2009

Usando Threads con parametros

Utilizar Threads brota a la necesidad de ejecutar multiples operaciones relativamente pesadas.

Pesadas en el sentido que el tiempo para concluir su ejecucion, es relativamente indeterminado. Es decir, la aplicacion NO puede quedarse a la espera de que concluya dicha operacion sin que el usuario quede inhabilitado de continuar usando el software.

Los Threads permiten una solucion a esta necesidad.

Sin embargo, como toda operacion siempre se requerira de una especie de parametrizacion, es decir, enviarle una serie de parametros para que se ejecute con ciertas variables inicializadas previamente.

¿Que hacer ante este requerimiento? ¿Como puedo pasarle parametros a un metodo corriendo sobre un Thread?

Un metodo extenso, es casi siempre una potencial clase, es decir un class, que podras encapsular de la manera que mejor creas conveniente.

Aquel metodo relativamente extenso y pesado, podra ser abstraido a una clase, a la cual expondras un metodo publico sin parametros: Run, por ejemplo.

El constructor de la clase, tendra todos los parametros necesarios que requiera esa operacion relativamente pesada.

Entonces, tu instanciaras un objeto de dicha clase, y colocaras sobre un Thread el metodo Run de aquella class.

MyClass o = new MyClass( param1, param2 )
Thread t = new Thread( o.Run );
t.Start();

Este mecanismo te brindara la solucion a tus problemas.

Por otro lado, existe una clase propia del .NET Framework llamada ParameterizedThreadStart pero como todo lo que esta disponible para usar en el .NET Framework, tiene un costo, perder el control sobre la ejecucion interna de la operacion sobre el Thread.

Algo que a la primera, puede que NO le tomes la minima importancia, pero que luego, conforme van madurando el producto de software, este debe ajustarse a mas necesidades que la inicialmente indicadas.

Por lo que perder el control, tendra un costo mas alto despues.

Ese despues, esta solo a la vuelta de la esquina. NO lo dudes!

Wednesday, November 26, 2008

event srcElement Firefox bug

Siguiendo con la saga de posts sobre Firefox y el trabajo adicional que implica hacer que el aplicativo se vea relativamente bien sobre este browser.

Debes tener en cuenta que, en la medida de los posible, el desarrollo empieze a desarrollarse sobre Firefox pues este browser es mas estricto tanto en su presentacion como en la interaccion con el usuario y sus scripts.

El muy usado event.srcElement NO sirve para Firefox. Tan simple y claro como eso.

Lo que sucede es que cada funcion de javascript que asocies a un evento de algun element HTML deberia utilizar esta firma: Foo( this ).

De esa manera el event.srcElement quedaria relegado.

function Foo( src )
{
   /* Utilizas src como si fuese event.srcElement */
}

Good coding!

parentElement Firefox bug parentNode

Cuando desarrollas para Firefox debes liar con algunas dificultades. Firefox maneja un modelo distinto para ciertas cosas que Internet Explorer regala a discrecion.

Por ejemplo, en el modelo de objetos DOM del documento HTML a nivel de script, un elemento cualesquiera -en Firefox- NO cuenta con su correspondiente parentElement.

Esto podria traerte mas de una molestia, pero debes tener claro que Firefox implica algo mas de trabajo por parte del desarrollador.

Para superar este escollo, debes usar la propiedad parentNode.

if( obj.parentElement )
{
   /* usas parentElement */
}
else
{
   if( obj.parentNode )
   {
      /* usas parentNode */
   }
   else
   {
      throw 'What is your fucking browser?';
   }
}

Good coding!

Monday, November 17, 2008

UpdatePanelAnimationExtender loading

UpdatePanelAnimationExtender es uno de los controles mas usados del Ajax Control Toolkit.

UpdatePanelAnimationExtender brinda la facilidad de mostrar alguna animacion mientras el UpdatePanel demora en ejecutar la operacion que se le ha encomendado a realizar.

Por ejemplo si tuviese que mostrar informacion cuyo origen de datos requiere mayor tiempo de ejecucion, pues el UpdatePanelAnimationExtender es la opcion a usar.

NO deberias cambiar nada en tu UpdatePanel para utilizar el UpdatePanelAnimationExtender.

UpdatePanelAnimationExtender es una seccion declarativa a nivel de la pagina ASPx muy sencilla.

<cc1:UpdatePanelAnimationExtender ID="_animation" runat="server" BehaviorID="animation" TargetControlID="_update">

Donde _update es un UpdatePanel.

El elementos interno es <Animations> dentro del cual se declaran <OnUpdating> y <OnUpdated> en los cuales se definiran las acciones de animacion que se crean convenientes.

Dentro de cada una de estas, pueden definirse acciones que pueden ser <Sequence> o <Parallel> quienes han de ejecutar las acciones de animacion en orden secuencial -que seria lo ideal- o en forma paralela cada accion de manera casi concurrente.

La accion casi por default utilizada es <EnableAction> en cuya propiedad AnimationTarget se define el boton que ordena la ejecuion del proceso que se vaya a realizar para deshabilitar dicho boton mientras se encuentra ejecutando. Para que una vez realizado volver a su estado original.

UpdatePanelAnimationExtender brinda una serie de acciones a configurar en modo declarativo, para que finalmente esto sea interpretado con el Runtime del Ajax y hacer lo que le hayas configurado que haga.

Para hacer cosas mas raras puedes usar el <ScripAction> que en su propiedad Script solicita el metodo javascript a ejecutar.

En <OnUpdating> cambios los estados de los controles que tienes disponbles en la interfaz de usuario que luego en el <OnUpdated> regresas a su estado irginal.

Thursday, November 13, 2008

Remote Debugging Monitor Visual Studio

Remote Debugging Monitor permite depurar una aplicacion ASP.NET sobre el servidor. Por cuestiones de seguridad, debe entenderse que esto se realizara sobre un servidor en un entorno de Testing o algo relativamente similar.

Una forma sencilla de usarla al desarrolar aplicaciones con tu Visual Studio .NET 2008, donde las aplicaciones ASP.NET utilizan el ASP.NET Develoment Server sobre algun puerto en particular, dicho proceso utiliza la cuenta de usuario de la actual sesion de Windows.

Muy probablemente todo funcione de maravillas en tu pequeño entorno de desarrollo -tu PC- mas aun si estas en el grupo de Administradores de tu machine.

Bueno, puede que instales el IIS en tu PC para publicar tus proyectos ASP.NET en un entorno inicial de testeo.

Al probrar aquello en un simple http://localhost/myWebApp/ veras que empiezan a brotar excepciones que antes NO aparecian, pues el usuario en el que se levanta el w3wp.exe es el [NT Authority\Network service].

Pues depurar la aplicacion alli, seria ideal. ¿NO?

Para ello, abres el Visual Studio .NET 2008, vas al menu Tools y eleges la opcion Attach to process....

Te mostrara una ventana en la cual el Transport elegido es por Default, entonces deberas ingresar en el campo Qualifier el valor localhost, checkear Show processes in all sessions, hacer clic en en boton Refresh, buscar en la lista el proceso w3wp.exe y finalmente hacer clic en el boton Attach.

Luego podras ingresar en tu brower el http://localhost/myWebApp/ esperando que ante cualquier excepcion que se produzca en tu aplicacion -mientras que la manoseas- el Visual Studio .NET 2008 permitira visualizar la linea de codigo que general dicha excepcion.

Thursday, November 06, 2008

Entity Framework Visual Studio 2008

Entity Framework es una herramienta que se monta sobre el Linq To Sql para interactuar contra la Base de Datos, y brinda al developer facilidades de herencia y composicion en un modelo de clases, como Dios manda, con caracteristicas propias de OOP -Object Oriented Programing- que los ORM -Object Relational Mapping- NO nos brindaban, como lo aprendimos en la preciosa e inaplicable teoria.

En fin, Entity Framework hace el esfuerzo de encaminarnos al mundo de los objetos con aquellas caracteristicas de herencia y composicion de clases -que habiamos dejado de lado por los tools de mapeo entre un mundo de entidades y el mundo relacional- que posteriormente hagan el mapping contra las columnas de las tablas de nuestra Base de Datos.

Para poder utilizarlo es importante que descargues el Visual Studio .NET 2008 Service Pack 1 que viene junto con el .NET Framework 3.5 Service Pack 1.

Visual Studio .NET 2008 Service Pack 1 (ISO)

De manera que tendras los primeros parches de la herramienta de desarrollo por un lado y de la plataforma por el otro, todo en un mismo paquete.

Luego tendras que agregar un item ADO.NET Entity Data Model a tu proyecto y si tienes tu base de datos construida -con relationships- podras seguir el wizard y obtener todo el modelo de clases justo y necesario.

Ahora, si deseas, puedes seguir la opcion advanced, y contruir tus clases a pedal -es decir tu mismo pe- tomando en cuanta las caracteristicas del Entity Framework para definir tus campos y relaciones entre las clases.

Ya sabes, sigue el camino de la verdad.

ArgumentException Entity Framework

Cuando utilizas varios proyectos en tu solucion del Visual Studio .NET 2008 para organizar correctamente la arquitectura de tu producto de software, muy probablemente utilizes alguno para recibir alli el Data Model de tu Entity Framework y todas las clases que se definan en dicho Data Model.

Un archivo app.config se definira en aquel proyecto con una definicion del connectionString que deberas hacer COPY & PASTE -utlizando una neurona- en el web.config de tu proyecto ASP.NET, de lo contrario recibiras un mensaje como este:

The specified named connection is either not found in the configuration, not intended to be used with the EntityClient provider, or not valid.

Aquel mensaje nos dice que efectivamente NO encuentra una definicion de connectionString en el web.config de tu aplicativo ASP.NET, al momento de instanciar el contexto referido a tu modelo de clases.