8

我刚刚开始使用 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<>);

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

4

1 回答 1

12

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

简而言之,我的模型不知道,也不关心它的存储位置或方式。它只定义了一个接口来描述它需要如何与该存储进行交互。我的 DAL 定义了一个实现该接口并使用 SQLite 作为其后备存储的类。由于映射仅对 SQLite 有意义,因此我在此处定义了映射。

问题是 DapperExtensions 反映到定义 POCO 的程序集中寻找它们的 ClassMappers,但由于我的程序集在不同的程序集中,因此没有找到它们。

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

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

因此,由于我的映射与我的静态 Mapper 类(具有静态的“初始化”调用)在同一个地方定义,所以我现在要做的就是告诉 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();
        }
    }
}

完成并完成!关于发现这一点的零文档,所以我希望这对其他人有帮助!

于 2015-11-17T23:53:25.700 回答