Archivos para Junio 2008

30
Jun
08

Composite WPF RC 1 liberado

Pues eso que ya está disponible para descarga la RC 1 de Composite WPF, más información aquí.

 

Los próximos dias estaré liado leyendo documentación tanto de LLBLGen Pro, como del Composite WPF para intentar ver como hacer algunas cosas, así que posiblemente tarde un poco en postear algo nuevo, pero sigo en ello … aunque no lo parezca xD

27
Jun
08

Usando LLBLGen Pro …

… me está pareciendo muy fácil de usar de momento ( si bien no he hecho nada complicado ), el código lo voy a generar usando el modelo Adapter, además he encontrado plantillas para generar DTO’s en los foros de LLBLGen, si bien las he modificado para que los DTO’s generados no tengan dependencia alguna de LLGLGen y además implementen INOtifyPropertyChanged y las relaciones que sean colecciones como ObservableCollection.

Si puedo haré también una plantilla para generar de forma automática los mappers para los DTO’s, aunque sean un poco básicos, me valdrían para ahorrarme un poco de trabajo :)

image

26
Jun
08

LLBLGen Pro …

… es lo que voy a usar finalmente para la parte de persistencia, usando Data Transfer Objects ( DTO’s ) para pasar datos entre el cliente y los servicios de datos.

Ahora solo me queda definir todo el modelo en LLBLGen Pro antes de seguir …

25
Jun
08

Trasteando …

… con WPF y el CompositeWPF, definiendo la estructura del Shell de la aplicación, de momento se ve así:

image

Tiene zonas para:

  • Menú, la única fija va a ser la de archivo el resto se añadirán dinámicamente al cargarse los módulos de la aplicación.

image

  • Barra de herramientas, común para todas las vistas de la aplicación con las opciones típicas, nuevo, editar, borrar, etc …
  • La zona central es un TabControl, en el que se irán mostrando las vistas, los botones de Cerrar y Cerrar todo de la barra de herramientas servirán para cerrar los tabs de forma individual o en grupo.
  • Una barra de estado.

Para la carga del shell me he creado una pequeña clase base:

   1: public abstract class SmartClientApplication<TShell, TPresenter> : UnityBootstrapper
   2:     where TShell : IShellView
   3:     where TPresenter: IShellPresenter
   4: {
   5:     #region · Protected Methods ·
   6:  
   7:     protected override void ConfigureContainer()
   8:     {
   9:         Container.RegisterType<IShellView, TShell>();
  10:  
  11:         base.ConfigureContainer();
  12:     }
  13:  
  14:     protected override DependencyObject CreateShell()
  15:     {
  16:         TPresenter presenter = Container.Resolve<TPresenter>();            
  17:         presenter.ShowView();
  18:  
  19:         IShellView view = presenter.View;
  20:  
  21:         return view as DependencyObject;
  22:     }
  23:  
  24:     #endregion
  25: }

Se limita a configurar el container de Unity (DI) y mostrar la ventana del Shell de la aplicación.

La interface utilizada para la vista del Shell dispone de un único método para visualizar la ventana:

   1: public interface IShellView
   2: {
   3:     #region · Methods ·
   4:  
   5:     void ShowView();
   6:  
   7:     #endregion
   8: }

La interface para el presenter del Shell, que dispone de una propiedad para la vista asociada al presenter y un método para mostrar la ventana:

   1: public interface IShellPresenter
   2: {
   3:     #region · Properties ·
   4:  
   5:     IShellView View
   6:     {
   7:         get;
   8:     }
   9:  
  10:     #endregion
  11:  
  12:     #region · Methods ·
  13:  
  14:     void ShowView();
  15:  
  16:     #endregion
  17: }

Y por último la implementación concreta de SmartClientApplication para la aplicación, que está definida con un Singleton y solo necesita implementar ( por el momento ) la carga de los módulos de la aplicación, que de momento se hará de forma estática.

Tiene además métodos para el manejo de la excepciones no controladas que por el momento están sin implementar correctamente.

   1: public class ShellApplication : SmartClientApplication<ShellWindow, ShellPresenter>
   2: {
   3:     #region · Singleton Instance ·
   4:  
   5:     public static readonly ShellApplication Instance = new ShellApplication();
   6:  
   7:     #endregion
   8:  
   9:     #region · Constructors ·
  10:  
  11:     private ShellApplication() : base()
  12:     {
  13:     }
  14:  
  15:     #endregion
  16:  
  17:     #region · Protected Methods ·
  18:  
  19:     protected override IModuleEnumerator GetModuleEnumerator()
  20:     {
  21:         return new StaticModuleEnumerator().AddModule(typeof(ModuloConfiguracion));
  22:     }
  23:  
  24:     #endregion
  25:  
  26:     #region · Unhandled Exception ·
  27:  
  28:     public void OnUnhandledException(object sender, UnhandledExceptionEventArgs e)
  29:     {
  30:         Exception ex = e.ExceptionObject as Exception;
  31:  
  32:         if (ex != null)
  33:         {
  34:             // MessageBox.Show(this.BuildExceptionString(ex));
  35:             throw ex;
  36:         }
  37:         else
  38:         {
  39:             throw new Exception("An Exception has occured, unable to get details");
  40:             // MessageBox.Show("An Exception has occured, unable to get details");
  41:         }
  42:  
  43:         Environment.Exit(0);
  44:     }
  45:  
  46:     private string BuildExceptionString(Exception exception)
  47:     {
  48:         StringBuilder messageBuilder = new StringBuilder();
  49:  
  50:         messageBuilder.AppendFormat("{0}{1}{2}", exception.Message, Environment.NewLine, exception.StackTrace);
  51:  
  52:         while (exception.InnerException != null)
  53:         {
  54:             messageBuilder.Append(BuildInnerExceptionString(exception.InnerException));
  55:  
  56:             exception = exception.InnerException;
  57:         }
  58:  
  59:         return messageBuilder.ToString();
  60:     }
  61:  
  62:     private string BuildInnerExceptionString(Exception innerException)
  63:     {
  64:         StringBuilder messageBuilder = new StringBuilder();
  65:  
  66:         messageBuilder.AppendFormat("{0}{1}", Environment.NewLine, " InnerException ");
  67:         messageBuilder.AppendFormat("{0}{1}{2}{3}", Environment.NewLine, innerException.Message, Environment.NewLine, innerException.StackTrace);
  68:  
  69:         return messageBuilder.ToString();
  70:     } 
  71:  
  72:     #endregion
  73: }
24
Jun
08

Estructura inicial de la solución para el proyecto

Ya tengo casi decidida la estructura de los proyectos en la solución para el proyecto ( el nombre … terriblemente original ;) del proyecto es … VisualPyme … ante lo original del mismo … se aceptan sugerencias :D ), sería mas o menos la siguiente:

 

Untitled

 

Una parte de los proyectos son de la aplicación en sí (VisualPyme.*) y otra para un pequeño Framework (Framework.*) que tendrá los proyectos que sean genéricos ( o sea, de uso en cualquier aplicación ).

Los proyectos de la aplicación, se dividen en :

  • Proyectos para los distintos módulos que compondrán la aplicación.
  • Proyectos para el “modelo” de datos (ahora mismo generados con LLBLGen Pro) y los servicios asociados ( en principio servicios de WCF … pero está por ver aun :) ).
  • Proyectos para el Shell de la aplicación.
  • Proyectos para los servicios comunes que estarán disponibles en cualquier módulo de la aplicación (ahora mismo sólo hay uno para servicios de datos de contexto que deban estar disponibles para cualquier aplicación).

Los proyectos del Framework, se dividen en :

  • Proyectos de la interface de usuario, ahora mismo hay 2 definidos (al estilo de los que se suelen usar con SCSF), uno para la declaración de interfaces a usar en la implementación de la interface de usuario y otro para la implementación de esas interfaces. Como las vistas van a tener tareas que son muy repetitivas la idea es implementar en estos dos proyectos, la parte que se pueda implementar de forma genérica para no andar repitiendo esas tareas en cada vista de la aplicación.
  • Proyectos para los servicios genéricos, de momento no hay ninguno, pero es posible que acabe añadiendo servicios de criptografía y caché (que tengo implementados desde hace tiempo ya :) ).
  • Proyectos de utilidades, de momento sólo hay uno con una sencilla implementación de un evaluador de expresiones (que tenia implementado de hace tiempo ya :) ).

Y eso es todo, por el momento, que no es poco, lo más probable es que tenga una solución paralela para los test unitarios ( los haré con Nunit los más probable ), exactamente con la misma estructura.

Ah ! de control de versiones subversion con TortoiseSVN.

24
Jun
08

2 links de interés para el desarrollo con WPF

Ando a la busqueda de información de ineteres sobre WPF, en el camino de momento me encontrado con 2 links muy interesantes ( entre otros muchos, por que hay bastante información online )

1. WPF Application Quality Guide

2. XAML and WPF Coding Guidelines

22
Jun
08

Decidiendo ….

… finalmente voy a usar WPF para la UI :) he estado buscando un poco más de información entre otras cosas he encontrado un post muy interesante, 10 reasons you should consider WPF for your next desktop application, algunas de las razones son realmente interesantes ( aunque seguro que hay quien podría dar otras 10, o más, para no usarlo XD ).

Dos de mis razones son que no tengo problemas de tiempo y que así aprendo WPF que tenia muchas ganas :)

Con respecto a lo que comentaba en el anterior post del Expression blend, bueno no creo que me llegue  a hacer mucha falta, ni soy diseñador ( jejeje ), ni voy a usar ni animaciones, ni 3D, …

Si hay alguna cosa que no se solucione con el soporte de tiempo de diseño, pues me queda la opción de modifcar el XAML a mano :D

Voy a usar el Composite WPF ( aka Prism ), seguramente echaré en falta alguna de las cosas de CAB, pero siempre me queda la opción de implementarlo a mano ( hay una serie de artículos muy interesante sobre esto en el blog de Jeremy D. Miller )

21
Jun
08

Mucho tiempo sin escribir nada …

En el último año la verdad es que no había tenido muchas ganas de gastar mi tiempo libre delante del ordenador programando … de hecho en los ultimos 6 meses apenas he hecho un par de cosillas en el cliente de XMPP pero parece que poco a poco las voy recuperando … eso si .. muy poco a poco :)

Como tengo interés en ver algunas de las cosas “nuevas” de .NET, como Windows Presentation Foundation y Windows Communication Foundation, ultimamente he estado pensando en retomar la idea de portar una aplicación antigua ( de Gestión y Contabilidad ) a .NET.

Algunas cosas las tengo claras otras no tanto jejeje :) Las dos grandes dudas que tengo ahora mismo son.

  • WPF o Windows Forms. Por un lado tengo ganas ( muchas ) de aprender WPF por otro parece que no hay nada similar al Smart Client Software Factory para WPF ( ya había hecho cosas con el Composite UI Application Block y la verdad es que es terriblemente bueno ), lo más parecido es Prism, que me da la impresión de que está un poco verde aún ( y a saber si le pasará lo mismo que a Acrópolis … ). Además no se hasta que punto sería necesario usar el Expression Blend ( que además es de pago así que inicialmente queda descartado el usarlo jejeje ) para poder hacer la UI con WPF.
  • LLBLGen Pro o NHibernate, para la parte de persistencia, como la base de datos tiene algo más de 100 tablas necesito si o si que la parte de generación de código sea lo más sencilla posible.
    • LLBLGen Pro. Tengo licencia :) , gracias a la generosidad de Frans Bouma ( gracias Frans :) ), tiene una buena cantidad de posibilidades, es fácil de aprender ( por lo que llevo visto ) y tiene la gran ventaja de tener un IDE muy bueno, la única pega es que quiero usar MVP en la UI y WCF para acceder a la capa de negocios ( no tendría por que usar WCF … pero me apetece ), y no quiero dejar atada la UI a las entidades generadas por LLBLGen, y tampoco quiero usar unas entidades para la UI y otras para la parte de persistencia ( si puedo evitarlo claro )
    • NHibernate. La gran pega es que no he encontrado nada para generar y mantener los mappings  de forma sencilla, y desde luego hacerlo a mano no es una opción :) si alguién sabe de alguna que lo diga xD

Si finalmente me decido a llevar a delante el tema iré contando en el blog como lo llevo xD




calendario

Junio 2008
L M X J V S D
« Ene   Jul »
 1
2345678
9101112131415
16171819202122
23242526272829
30  

a