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

Mar*_*eIV 6 c# dapper dapper-extensions

我刚开始玩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;
    }
}
Run Code Online (Sandbox Code Playgroud)

...这里是专门用于LibraryInfo类的映射器

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

PluralizedAutoClassMapper我通过调用以下内容来开始工作......

DapperExtensions.DapperExtensions.DefaultMapper = typeof(CustomPluralizedMapper<>);
Run Code Online (Sandbox Code Playgroud)

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

Mar*_*eIV 11

好的,我明白了.问题是因为我正在使用IoC而我的POCO与映射的装配不同.

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

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

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

DapperExtensions.DapperExtensions.SetMappingAssemblies(new[]{
    assemblyA, assemblyB, ...assemblyN
});
Run Code Online (Sandbox Code Playgroud)

因为我的映射定义在与我的静态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>
    {
        ...
    }
}
Run Code Online (Sandbox Code Playgroud)

现在一切正常!

更好的是,因为我可以在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();
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

做完了!有关于找到这个的ZERO文档,所以我希望这有助于其他人!