AjGenesis: Modelo generado desde los assemblies

El bueno de Darío Quintana ha actualizado un programa que había escrito hace un tiempo, para generar un modelo de AjGenesis desde assemblies compilados. Ahora, la nueva versión está descripta en:

Generando con AjGenesis desde los assemblies

En la imagen vemos el directorio del proyecto principal, que está acompañado por otro proyecto de tests con NUnit, ejemplos, y código ya compilado.

Es interesante ver cómo el modelo se puede obtener desde distintas fuentes. En un post anterior, describí una forma, apenas un ejemplo, de obtener información desde una base de datos:

AjGenesis- Modelo desde la Base de Datos

Darío, en su post, muestra cómo usa su proyecto desde un código de tareas de AjGenesis:

function GetEntities(path) AssemblyManager.LoadFrom(AjGenesisFromAssemblyPath) obj = new AjGenesis.FromAssembly.Collector() list = obj.GetEntities(path,null) return list end function

Usa el nuevo AssemblyManager para cargar la librería AjGenesis.FromAssembly.

Las clases Model, Entity, Property son el modelo, de manera similar a las que tenemos en ejemplos de AjGenesis. La clase Collector es la que crea un objeto Generator, que es el que hace el trabajo duro de encontrar las entidades dentro de un Assembly:

using System.Collections; namespace AjGenesis.FromAssembly { public class Collector { public ArrayList GetEntities(string assemblyPath, string ns) { Generator g = new Generator(); g.Path = assemblyPath; g.AssemblyToObjects(); ArrayList array = new ArrayList(); foreach (Entity entity in g.Model.Entities) { array.Add(entity); } return array; } } }

Un fragmento de Generator:

 

public void AssemblyToObjects() { Assembly assembly = Assembly.LoadFrom(Path); Type[] types; types = assembly.GetTypes(); //Get all types from the assembly for (int i = 0; i < types.Length; i++) { //Veo que interfaces está implementando bool ImplementaIEntity = false; Type[] interfacesTypes = types[i].GetInterfaces(); ImplementaIEntity = true; if (ImplementaIEntity) { Entity entity = new Entity(); entity.Name = GetTypeName(types[i].Name); entity.FullName = types[i].FullName; if (types[i].BaseType != null) { entity.Inherits = GetTypeName(types[i].BaseType.Name); entity.InheritsFullName = types[i].BaseType.FullName; } PropertyInfo[] propertyInfo = types[i].GetProperties(); foreach (PropertyInfo pi in propertyInfo) { Property prop = new Property(); prop.Name = pi.Name; prop.TypeName = pi.PropertyType.Name; if (pi.PropertyType.FullName != null) { prop.TypeFullName = pi.PropertyType.FullName; } else prop.TypeFullName = string.Empty; entity.Properties.Add(prop); } _model.Entities.Add(entity); } } }

Este es sólo un fragmento, vean el código original de Darío para más detalle. Se usa Reflection para obtener los tipos de un assembly, y las propiedades de cada tipo. Creo que Darío quiere mejorar la forma de detectar cuándo un tipo en el assembly es o no una entidad, usando interfaces o atributos.

Nos leemos!

Angel “Java” Lopez
http://www.ajlopez.com/

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

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=""> <s> <strike> <strong>