¿Cómo se registran las subclases DapperExtension ClassMapper para que se utilicen?

c# dapper dapper-extensions

Pregunta

Empecé a jugar con DapperExtensions y parece muy prometedor. Sin embargo, estoy confundido sobre cómo manejar el registro de las subclases ClassMapper.

Tengo un PluralizedAutoClassMapper personalizado y un ClassMapper normal y estoy tratando de usar ambos.

Aquí está mi mapeador pluralizado ...

public class CustomPluralizedMapper<T> : PluralizedAutoClassMapper<T>
where T : class 
{
    private readonly Type[] SinglularTablePocoTypes = new []{
        typeof(LibraryInfo)
    };

    public override void Table(string tableName)
    {
        base.Table(tableName);

        if(SinglularTablePocoTypes.Any(type => string.Equals(type.Name, tableName, StringComparison.CurrentCultureIgnoreCase)))
            TableName = tableName;
    }
}

... y aquí está el mapeador específicamente para la clase LibraryInfo

public class LibraryInfoMapper : ClassMapper<LibraryInfo>
{
    public LibraryInfoMapper()
    {
        Map(libraryInfo => libraryInfo.Name).Column("LibraryName");
        Map(libraryInfo => libraryInfo.Description).Column("LibraryDescription");
        AutoMap();
    }
}

El PluralizedAutoClassMapper puedo trabajar llamando al siguiente ...

DapperExtensions.DapperExtensions.DefaultMapper = typeof(CustomPluralizedMapper<>);

Pero no estoy seguro de cómo usar el otro al mismo tiempo. ¿Qué me estoy perdiendo?

Respuesta aceptada

Ok, lo descubrí. El problema se debe a que estoy usando IoC y mis POCO están en un ensamblaje diferente de las asignaciones.

En resumen, mi modelo no tiene ni idea, ni le importa dónde o cómo se almacena. Solo define una interfaz que describe cómo necesita interactuar con ese almacenamiento. Mi DAL define una clase que implementa esa interfaz y usa SQLite como almacenamiento de respaldo. Como las asignaciones solo tienen sentido con respecto a SQLite, ahí es donde definí las asignaciones.

El problema es que DapperExtensions se refleja en el conjunto que define las POCO en busca de sus ClassMappers, pero como las mías estaban en un ensamblaje diferente, no se encontraron.

Sin embargo, puede indicarle a DapperExtensions que busque ensamblajes externos a través de la siguiente línea de código ...

DapperExtensions.DapperExtensions.SetMappingAssemblies(new[]{
    assemblyA, assemblyB, ...assemblyN
});

Así que como mis asignaciones están definidas en el mismo lugar que mi clase Mapper estática (que tiene la llamada estática 'Initialize') todo lo que tengo que hacer ahora es decirle a DapperExtensions que busque allí como tal ...

public static class Mappings
{
    public static void Initialize()
    {
        DapperExtensions.DapperExtensions.DefaultMapper = typeof(CustomPluralizedMapper<>);

        DapperExtensions.DapperExtensions.SetMappingAssemblies(new[]
        {
            typeof(Mappings).Assembly
        });
    }

    public class CustomPluralizedMapper<T> : PluralizedAutoClassMapper<T>
    where T : class 
    {
        ...
    }

    public class LibraryInfoMapper : ClassMapper<LibraryInfo>
    {
        ...
    }
}

¡Y ahora todo funciona!

Mejor aún, dado que puedo especificar el nombre de la tabla en LibraryInfoMapper, en realidad no hay necesidad de CustomPluralizedMapper y, por lo tanto, puedo usar el PluralizedAutoClassMapper estándar como tal ...

public static class Mappings
{
    public static void Initialize()
    {
        DapperExtensions.DapperExtensions.DefaultMapper = typeof(PluralizedAutoClassMapper<>);

        DapperExtensions.DapperExtensions.SetMappingAssemblies(new[]
        {
            typeof(Mappings).Assembly
        });
    }

    public class LibraryInfoMapper : ClassMapper<LibraryInfo>
    {
        public LibraryInfoMapper()
        {
            Table("LibraryInfo");
            AutoMap();
        }
    }
}

¡Hecho y hecho! Había documentación CERO para descubrir esto, así que espero que esto ayude a los demás.



Licencia bajo: CC-BY-SA with attribution
No afiliado con Stack Overflow
¿Es esto KB legal? Sí, aprende por qué
Licencia bajo: CC-BY-SA with attribution
No afiliado con Stack Overflow
¿Es esto KB legal? Sí, aprende por qué