6

Todas mis entidades y objetos de valor implementan las interfaces de marcador IEntity y IValueObject. Los he creado para ser tratados como componentes de este modo:¿Cómo se puede automatizar una colección de componentes con Fluiber NHibernate?

public override bool IsComponent(Type type) 
{ 
    return typeof(IValueObject).IsAssignableFrom(type); 
} 

public override bool ShouldMap(Type type) 
{ 
    return typeof(IEntity).IsAssignableFrom(type) || typeof(IValueObject).IsAssignableFrom(type); 
} 

Desafortunadamente, esto no parece permitir a las entidades que tienen colecciones de objetos de valor que se automapped como colecciones de componentes. Por ejemplo:

public class MyEntity : IEntity 
{ 
    public IList<MyValueObject> Objects { get; set; } 
} 

public class MyValueObject : IValueObject 
{ 
    public string Name { get; set; } 
    public string Value { get; set; } 
} 

¿Hay alguna manera de definir una convención de tal manera que, cada vez que un IEntity tiene una IList de un tipo que implementa IValueObject, que se asigna como si hubiera especificado:

HasMany(x => x.Objects) 
    .Component(x => { 
     x.Map(m => m.Name); 
     x.Map(m => m.Value); 
    }); 

Lo que no quiero hacer es tener que hacer estas anulaciones manualmente para cada clase y escribir cada propiedad para el objeto de valor una y otra vez.

Respuesta

0
  1. Cree una nueva clase que herede de HasManyStep (FluentNHibernate.Automapping.Steps).
  2. reemplazar el método ShouldMap() con algo como:

    return base.ShouldMap(member) && IsCollectionOfComponents(member) 
    
  3. Añadir su lógica para:

    public void Map(ClassMappingBase classMap, Member member) 
    { ... } 
    
  4. Reemplazar el paso por defecto con su nueva:

    public class MyMappingConfiguration : DefaultAutomappingConfiguration 
    { 
        public override IEnumerable<IAutomappingStep> GetMappingSteps(AutoMapper mapper, IConventionFinder conventionFinder) 
        { 
         var steps = base.GetMappingSteps(mapper, conventionFinder); 
         var finalSteps = steps.Where(c => c.GetType() != typeof(FluentNHibernate.Automapping.Steps.HasManyToManyStep)).ToList(); 
         var idx = finalSteps.IndexOf(steps.Where(c => c.GetType() == typeof(PropertyStep)).First()); 
         finalSteps.Insert(idx + 1, new MyCustomHasManyStep(this)); 
         return finalSteps; 
        } 
    } 
    

Nota: También puede obtener el código fuente original de HasManyStep.cs y copiarlo en su proyecto para presentar su lógica personalizada.

Cuestiones relacionadas