Comment enregistrez-vous les sous-classes DapperExtension ClassMapper afin qu'elles soient utilisées?

c# dapper dapper-extensions

Question

Je viens de commencer à jouer avec DapperExtensions et cela semble très prometteur. Cependant, je ne comprends pas comment gérer l'enregistrement des sous-classes ClassMapper.

J'ai à la fois un PluralizedAutoClassMapper personnalisé et un ClassMapper standard et j'essaie d'utiliser les deux.

Voici mon mappeur pluralisé ...

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;
    }
}

... et voici le mappeur spécifiquement pour la classe LibraryInfo

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

Le PluralizedAutoClassMapper Je commence à travailler en appelant les éléments suivants ...

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

Mais je ne sais pas comment utiliser l'autre en même temps. Qu'est-ce que je rate?

Réponse acceptée

Ok, je l'ai compris. Le problème était parce que j'utilise IoC et mes POCO sont dans un assemblage différent des mappages.

En bref, mon modèle n’a aucune idée, et ne se soucie pas de savoir où et comment il est stocké. Il ne définit qu'une interface décrivant la manière dont il doit interagir avec ce stockage. Mon DAL définit une classe qui implémente cette interface et utilise SQLite comme stockage de sauvegarde. Étant donné que les mappages n'ont de sens que pour SQLite, c'est là que j'ai défini les mappages.

Le problème est que DapperExtensions se reflète dans l'assembly qui définit les POCO recherchant leurs ClassMappers, mais comme le mien se trouvait dans un assemblage différent, ils n'étaient pas trouvés.

Cependant, vous pouvez indiquer à DapperExtensions de rechercher des assemblys externes via la ligne de code suivante ...

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

Donc, comme mes mappages sont définis au même endroit que ma classe Mapper statique (qui a l'appel statique «Initialize»), il ne me reste plus qu'à demander à DapperExtensions d'y chercher comme ça ...

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>
    {
        ...
    }
}

Et maintenant tout fonctionne!

Mieux encore, comme je peux spécifier le nom de la table dans LibraryInfoMapper, mon CustomPluralizedMapper n'est pas nécessaire et je peux donc simplement utiliser le PluralizedAutoClassMapper standard comme ça ...

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();
        }
    }
}

Fait et fait! Il y avait de la documentation ZERO sur cette découverte, alors j'espère que cela aidera les autres!




Sous licence: CC-BY-SA with attribution
Non affilié à Stack Overflow
Est-ce KB légal? Oui, apprenez pourquoi
Sous licence: CC-BY-SA with attribution
Non affilié à Stack Overflow
Est-ce KB légal? Oui, apprenez pourquoi