Estuve trabajando agregando una "feature" a mi proyecto de generación de código AjGenesis. El sistema maneja un modelo definido por el usuario, que puede ser cargado en memoria desde archivos .xml. AjGenesis puede procesar el modelo, completarlo, invocar a objetos .NET, crear directorios, archivos y aplicar templates para crear código y archivos de texto cualesquiera.
Pero el modelo reside en memoria: la deserialización desde XML es solamente una opción de implementación. Este fin de semana, he agregado el nuevo código en el repositorio de código del proyecto Codeplex: ahora, todo usuario de AjGenesis puede expresar su modelo en texto plano.
El modelo puede, entonces, expresarse en simples archivos de texto. Veamos un ejemplo.
El ejemplo más simple que se me ocurre es el modelo para una aplicación Hello World en AjGenesis. El modelo en XML es:
<Project Company="ajlopez.com">
<Message>Hello, World</Message>
</Project>
Ahora, podemos expresar el mismo modelo en un archivo de texto:
Project
Company = "ajlopez.com"
Message = "Hello, World"
End Project
Si necesitamos más mensajes, en XML escribíamos:
<Project>
<Messages>
<Message>Hello, World One</Message>
<Message>Hello, World Two</Message>
<Message>Hello, World Three</Message>
</Messages>
</Project>
Ahora, en texto, podemos escribir:
Project
Messages
Message = "Hello, World One"
Message = "Hello, World Two"
Message = "Hello, World Three"
End Messages
End Project
Se puede cargar el modelo desde el programa de consola, indicando un archivo .txt o .xml:
..\..\..\bin\AjGenesis.Console Model.txt ModuleVb.tpl HelloWorld.vb
..\..\..\bin\AjGenesis.Console Model.xml ModuleVb.tpl HelloWorld.vb
Lo mismo podemos hacer desde tareas de NAnt: cargar un modelo, en un archivo .XML o .txt.
Hay más ejemplos en:
Hello world Examples
Un modelo más realista, donde describimos entidades en un XML:
<?xml version="1.0" encoding="utf-8" ?>
<!--
An Entity with Properties
-->
<Entities>
<Entity Name="Customer">
<Description>A Customer</Description>
<Properties>
<Property Name="Id" Type="Id"/>
<Property Name="Name" Type="Text"/>
<Property Name="Address" Type="Text"/>
</Properties>
</Entity>
<Entity Name="Supplier">
<Description>A Supplier</Description>
<Properties>
<Property Name="Id" Type="Id"/>
<Property Name="Name" Type="Text"/>
<Property Name="Address" Type="Text"/>
</Properties>
</Entity>
</Entities>
ahora puede ser expresado en texto (no es el mismo modelo de arriba, pero similar):
Entities
Entity Customer
Description = "Customer Entity"
Properties
Property Id Type="Id"
Property Name Type="Text"
Property Address Type="Text"
End Properties
End Entity
Entity Supplier
Description = "Supplier Entity"
Properties
Property Id Type="Id"
Property Name Type="Text"
Property Address Type="Text"
End Properties
End Entity
End Entities
Una vez que el modelo es cargado en memoria, AjGenesis lo procesa como siempre, sin importar su forma original, texto o XML.
Más sobre AjGenesis:
Posts about AjGenesis (English)
Posts sobre AjGenesis (Spanish)
Apenas relacionado, pero interesante:
Problems for Textual Model Notations
Nos leemos!
Angel "Java" Lopez
http://www.ajlopez.com