如何注册DapperExtension ClassMapper子类以便使用它们

本文关键字:子类 ClassMapper 何注册 注册 DapperExtension | 更新日期: 2023-09-27 18:22:15

我刚刚开始使用DapperExtensions,它看起来很有前途。然而,我对如何注册ClassMapper子类感到困惑。

我有一个自定义的PluralizedAutoClassMapper和一个常规的ClassMapper,我正在尝试同时使用它们。

这是我的复数映射器。。。

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

这是LibraryInfo类专用的映射器

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

PluralizedAutoClassMapper我通过调用以下命令开始工作。。。

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

但我不知道如何同时使用另一个。我错过了什么?

如何注册DapperExtension ClassMapper子类以便使用它们

好吧,我想通了。问题是因为我使用的是IoC,而我的POCO位于与映射不同的程序集中。

简而言之,我的模型不知道,也不关心它存储在哪里或如何存储。它只定义了一个接口,描述它需要如何与该存储交互。我的DAL定义了一个实现该接口的类,并使用SQLite作为后备存储。由于映射只对SQLite有意义,所以我就是在这里定义映射的。

问题是DapperExtensions反映在定义POCO的程序集中,这些POCO正在寻找它们的ClassMapper,但由于我的是在另一个程序集中,所以没有找到它们。

但是,您可以告诉DapperExtensions通过以下代码行搜索外部程序集。。。

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

因此,由于我的映射与我的静态Mapper类(具有静态"Initialize"调用)定义在同一个位置,所以我现在所要做的就是告诉DapperExtensions在那里搜索,就像这样…

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

现在一切都好了!

更好的是,由于我可以在LibraryInfoMapper中指定表名,因此实际上不需要我的CustomPluralizedMapper,因此我可以像这样使用标准的PluralizedAutoClassMapper…

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

完成了,完成了!发现这一点的文档为零,所以我希望这能帮助其他人!