sábado, 23 de abril de 2011

La magia de ConfORM

Como ya comenté el el post anterior ConfORM permite configurar mediante convección el mapeo de las entidades de un dominio a un ORM.

Si a esto le sumamos el uso de NHibernate.Tool.hbm2ddl tendremos una experiencia “Code First” que tan de moda está ahora mismo.

ConfORM examina las clases que le indicamos que forman parte de nuestro dominio y genera la configuración necesaria para el ORM

Fabio Maulo hace que analizar de forma automática las clases de un dominio parezca sencillo. Identifica todo lo que necesita saber y genera un contrato de lo más sencillo para definir un DomainInspector, tal y como explica en este post.

public interface IDomainInspector
{
bool IsRootEntity(Type type);
bool IsComponent(Type type);
bool IsComplex(Type type);
bool IsEntity(Type type);

bool IsTablePerClass(Type type);
bool IsTablePerClassHierarchy(Type type);
bool IsTablePerConcreteClass(Type type);

bool IsOneToOne(Type from, Type to);
bool IsManyToOne(Type from, Type to);
bool IsManyToMany(Type role1, Type role2);
bool IsOneToMany(Type from, Type to);
bool IsHeterogeneousAssociations(MemberInfo member);
Cascade ApplyCascade(Type from, Type to);

bool IsPersistentId(MemberInfo member);
IPersistentIdStrategy GetPersistentIdStrategy(MemberInfo member);

bool IsPersistentProperty(MemberInfo role);
IDbColumnSpecification[] GetPersistentSpecification(MemberInfo role);
}


Fabio explica que una clase por si misma no puede definir como es su persistencia e identifica los casos en los que es necesario un poco de ayuda:



Por un lado están las estrategias de serialización



void TablePerClassHierarchy<TBaseEntity>();
void TablePerClass<TBaseEntity>();
void TablePerConcreteClass<TBaseEntity>();



Por otro lado, algunas relaciones que no se pueden (o no siempre) se pueden detectar automáticamente



void ManyToOne<TLeftEntity, TRigthEntity>();
void OneToOne<TLeftEntity, TRigthEntity>();
void ManyToMany<TLeftEntity, TRigthEntity>();



Y por último si los cambios en entidades desencadenan cambios en la otras (los típicos borrados en cascada, actualizaciones…)



void Cascade<TFromEntity, TToEntity>(Cascade cascadeOptions);



Con todos estos datos introducidos en el DomainInspector, ConfORM puede generar los metadatos necesarios para el ORM puede manejar la persistencia del dominio.



Fuente: http://fabiomaulo.blogspot.com/2010/02/conform-nhibernate-un-mapping.html

1 comentario:

  1. ¡Muy bueno el post! pero...
    "ConfORM examina las clases que le indicamos que forman parte de nuestro dominio y genera la"

    ¿la?

    ResponderEliminar