27 abril 2006

Inyección de dependencias

Un artículo muy interesante que no me he podido resistir a publicar en algún sitio (y como sólo tengo este blogcito, pues aquí va). Trata varios temas sobre diseño de capas de objetos: como desacoplarlas disminuyendo las dependencias de cada objeto, usando interfaces y pasando desde fuera los objetos que las cumplan, ya sea en el constructor o estableciendo una propiedad pública. Así permite el desarrollo de componentes opcionales, librerías para distintos departamentos, etc. Esto lo tendremos en cuenta cuando tengamos terminado nuestro Sota 1.0 para evolucionarlo en dirección a Motorwin.
Pero es que el artículo, además de esto, hace hincapié en los diseños MVC (Model - View - Controller) y MVP (Model - View - Presenter), los cuales se ven muy favorecidos de la Dependency Injection.
Y para colmo habla de las pruebas unitarias usando objetos Mock: objetos simulacro que tienen la interfaz del objeto real pero que simulan comportamientos determinados (por ejemplo, fallos en la base de datos).

19 abril 2006

Por fin un buen ORM

Señores (porque lectoras está visto que no hay), acabo de encontrar la primera implementación comercial similar a nuestro acceso a datos genérico: Express Persistent Objects.
Está bastante bien, es muy potente y bastante eficiente (mira las comparativas con ADO.NET), considera las relaciones entre objetos... todo muy bien, y además bastante bien documentado (al menos para comenzar). Cosas que echo en falta: actualmente sólo soporta Access y SQL Server (y no es extensible, tienen que ampliarlo ellos... aunque por 50€ más puede comprarse con código fuente), por esto mismo no podemos atacar actualmente a servicios web. No sé si los objetos soportan INotifyProperty (o como se llame), sí dice que la colección soporta IBindingList así que quizá sí, pero hay que mirar esto y el resto de cosas que llevamos hechas.
Por cierto, un ORM es un Object Relational Mapping, es decir, un Mapeo de Objetos con una base de datos Relacional, que es actualmente la responsabilidad principal (y lo es también en nuestro caso) que tiene la capa de acceso a datos en una implementación en 3 capas.

Etiquetas:

05 abril 2006

Un combo sobre objetos de negocio

Esta vez no me ha dado tiempo a anticiparme, y el desarrollo me ha pillado sin tener prevista una solución para el rellenado de combos desde objetos de negocio. Intentaré ser rápido:

Aquí va un ejemplo de un artículo donde se desarrolla un combo personalizado que puede ser borrado (NullableComboBox). Es muy interesante para las relaciones que sean opcionales, pero también nos sirve el ejemplo para ver cómo se conecta el contenido del combo con una IList que contendrá objetos de negocio.
Tenemos dos casos de uso del combo, y con esto que he contado solventamos el primero: rellenar datos desde una colección de objetos de negocio. El segundo es cuando los datos vienen de un enumerado. Para este caso se me ocurre crear una colección de pares KeyValuePair, como un diccionario (quizá con un diccionario mismamente), y vincular como origen de datos las dos propiedades que ofrece, Key y Value. Como el método que nos devuelve esta colección (que debe guardarse en caché, crearse una vez y reutilizarse después) no puede incluirse en el Enum, podemos ponerlo como estático en la clase que principalmente usa el enumerado (en el caso de TratamientoIVA podemos ponerlo en ECliente, por ejemplo).

Como curiosidad os cito también un artículo de CodeProject (qué buenos artículos hay ahí) sobre un ImageCombo, que no existe en .net, pero que se implementa muy fácilmente y con mucho provecho (joder, parezco Cervantes).

Y por último, una línea de investigación que dejo abierta: me surge a partir de una pregunta sobre el formateo y el reconocimiento (parse) de valores de negocio en un textbox (por poner un ejemplo) a través de un enlace a datos (DataBinding). Cubre las dos direcciones, el formateo (sincronización del control con los datos del objeto de negocio) y el parse (actualización del objeto de negocio con los cambios hechos en el control), y es muy interesante para ver cómo formatear números y fechas, cómo comprobar que un número es válido antes de asignarlo al objeto... Como os digo todo esto me surge a partir de una pregunta, hay que tirar del hilo y buscar la documentación necesaria para conocer bien cómo funcionan los eventos Convert (Format y Parse) del Binding, y qué es y cómo funciona un BindingContext.