Generación de código con AjGenesis para Mere Mortals Framework

En un proyecto en el que estoy trabajando, el equipo ágil del que soy miembro está desarrollando una aplicación completa de salud (es el Medusa Project), usando Mere Mortals framework como base para objestos de negocios, persistencia, y presentación en WinForm y ASP.NET. Pueden bajarse una versión de prueba de este framework en:

http://www.oakleafsd.com/

Hay una lista de características en

http://www.oakleafsd.com/MMNetFeatures/pgMMNetFeatures.htm

Pueden bajarse la guía de desarrollo de

MM .NET Developer’s Guide

El framework fue desarrollado por Kevin McNeish, Microsoft MVP, presidente y arquicecto jefe de Oak Leaf Enterprise. El framework soporta entidades tipadas, pero por abajo, está basado en datasets. Podemos generar un proyecto de business objects con templates de VS que vienen con el framework, y tiene un generador de código provisto por el producto, podemos generar las clases de objetos de negocios, derivadas desde la base de datos.

En mi equipo, alimentamos metadata leyendo información de la base de datos, y con esa información, generamos una aplicación web completa en ASP.NET, un librería de objetos de negocios, procedimientos almacenados, y DDL para regenerar la base. Todo usando AjGenesis, mi proyecto abierto de generación de código. Espero escribir algún post sobre esa experiencia. Las tareas y plantillas que usamos, han sido derivadas del ejemplo:

AjGenesis- Generating the model from the database
AjGenesis- Modelo desde la Base de Datos

En esto post, uso otra aproximación, más clásica en los ejemplos de AjGenesis: partir de un modelo abstracto, generando desde allí:

- Scripts para crear la base de datos
- Business Objects a la Mere Mortals en una librería de clases
- Proyecto WinForm con formularios de mantenimiento

Escribí sobre generación de aplicaciones en distintas tecnologías, desde un modelo abstracto, en:

Application Generation using AjGenesis
Generando aplicaciones con AjGenesis

pero recuerden: AjGenesis se basa en modelos de libre definición. Podemos modelar lo que querramos. Como ejemplo trivial:

Code Generation with AjGenesis- A Hello World application
Generando Código- Hello World con AjGenesis

El modelo

Pueden bajar el ejemplo desde la página de ejemplos del proyecto, en Codeplex:

MereMortalsExamples200906.zip

Contiene:

El modelo resido en el archivo Projects/AjFirstExample/Project.xml

<Project>

    <Name>AjFirstExample</Name>

    <Description>First Example using AjGenesis</Description>

    <Prefix>AjFE</Prefix>

    <Domain>com.ajlopez</Domain>

    <CompanyName>ajlopez</CompanyName>

    <Model>

        <Entities>

            <Entity Source="Entities/Customer.xml"/>

            <Entity Source="Entities/Supplier.xml"/>

        </Entities>

        <Lists>

            <List Entity="Customer"/>

            <List Entity="Supplier"/>

        </Lists>

        <Forms>

            <Form Entity="Customer"/>

            <Form Entity="Supplier"/>

        </Forms>

        <Views>

            <View Entity="Customer"/>

            <View Entity="Supplier"/>

        </Views>

    </Model>

</Project>

Referencia a dos entidades, Customer and Supplier. La entidad Customer:

<Entity>

    <Name>Customer</Name>

    <Description>Customer Entity</Description>

    <SetName>Customers</SetName>

    <Descriptor>Customer</Descriptor>

    <SetDescriptor>Customers</SetDescriptor>

    <SqlTable>Customers</SqlTable>

    

    <Properties>

 

        <Property>

            <Name>Id</Name>

            <Type>Id</Type>

        </Property>

 

        <Property>

            <Name>Name</Name>

            <Type>Text</Type>

            <SqlType>varchar(200)</SqlType>

        </Property>

 

        <Property>

            <Name>Address</Name>

            <Type>Text</Type>

            <SqlType>text</SqlType>

        </Property>

 

        <Property>

            <Name>Notes</Name>

            <Type>Text</Type>

            <SqlType>text</SqlType>

        </Property>

 

    </Properties>

</Entity>

 

Hay un modelo que describe la tecnología que vamos a usar en Projects/AjFirstExample/Technologies/VbNet3.xml:

<Technology>

    <Programming>

        <Dialect>VbNet3</Dialect>

    </Programming>

    <Database>

        <Dialect>MsSql</Dialect>

        <Name>AjFirstExampleMM</Name>

        <Host>(local)</Host>

    </Database>

</Technology>

Puede cambiar el host a .\SQLEXPRESS si no tiene un servidor MS SQL. Puede agregar <Username> y <Password> si quiere usar la seguridad de SQL. Si no están, el ejemplo usa seguridad integrada de Windows.

Generando la aplicación

Debe bajarse la versión liberada actual de AjGenesis, la 0.5, desde http://ajlgenesis.codeplex.com. Agregue el directorio bin a su lista de directorios en PATH. Hecho esto, podemos ejecutar desde el directorio del ejemplo:

GenerateProject.cmd AjFirstExample VbNet3

El primer parámetro es el nombre del proyecto, el segundo es la tecnología a usar. El comando invoca

AjGenesis.Console Projects\%Project%\Project.xml tasks\BuildProject.ajg  Projects\%Project%\Technologies\%Technology%.xml tasks\BuildTechnology.ajg tasks\BuildProg.ajg tasks\BuildSql.ajg




Esto lee el modelo de proyecto, ejecuta la tarea BuildProject, carga el modelo de tecnología, ejecuta la tarea de BuildTechnology. Finalmente, la tarea BuildProg genera el código, y BuildSql genera el DDL necesario para crear la base de datos.



Se crea un nuevo directorio, Build, que contiene el resultado:



En el directorio Sql, encontramos el comando ExecuteAll.cmd que crea la base de datos



Podemos ejecutarlo con un parámetro, especificando ahí el servidor:


ExecuteAll.cmd Bombadil


Si ejecutamos el comando sin parámetro, usa el host especificado en el modelo de tecnología.


En directorio Src encontraremos recién generada una solución .NET completa, con dos proyectos:



Podemos levantarla en Visual Studio 2008, y compilarla (necesitamos tener una versión de Mere Mortals Framework instalada).



La librería de clases contiene definiciones de objetos de negocios de Mere Mortals (usando clases parciales, clases de acceso a datos usando procedimientos almacenados, reglas….)



El proyecto WinForm tiene dos formularios de mantenimiento, para Customers y Suppliers:



Bueno, no será “uy que bruto, que aplicación”…. :-)… pero ejecuta:



Si no quieren seguir estos pasos, pueden bajarse la solución generada, de mi Skydrive


AjFirstExampleMereMortals.zip


Conclusiones


Usando un modelo abstracto, podemos generar los artefactos de textos que requiere el framework de Mere Mortals (o cualquier otro framework o tecnología como describí en Generación de código, AjGenesis, y Dunga dunga a la tecnología). Con clases parciales, y archivos separados, podemos regenerar código desde el modelo, sin perder el código manual que hayamos agregado. Podemos extender el código generado agregando validaciones automáticos, nuevas reglas, y cualquier estándar de codificación que estemos usando.


Pero el punto principal, para mí, es que usando un modelo abstracto, estamos separando el núcleo importante de nuestra aplicación, de los detalles técnicos´. Podemos regenerar la aplicación usando otro framework, otros lenguajes, otras tecnologías, y nuestro modelo podría ser el mismo. El modelo describe lo que queremos. Tareas, y plantillas terminan siendo un sistema experto, que conoce COMO obtener lo que queremos como aplicación.


Nos leemos!


Angel “Java” Lopez


http://www.ajlopez.com/en
http://twitter.com/ajlopez




This entry was posted in 10673, 1389, 2643, 6145. Bookmark the permalink.

2 Responses to Generación de código con AjGenesis para Mere Mortals Framework

  1. Luis Petek says:

    Doy Fe. Esto es así.

  2. Espinete says:

    Si, reflote, si

Leave a Reply

Your email address will not be published. Required fields are marked *

You may use these HTML tags and attributes: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>