我刚开始玩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<>);
但我不确定如何同时使用另一个。我错过了什么?
答案 0 :(得分:11)
好的,我明白了。问题是因为我正在使用IoC而我的POCO与映射的装配不同。
简而言之,我的模型不知道,也不关心它的存储位置或方式。它只定义了一个描述它如何与该存储交互的接口。我的DAL定义了一个实现该接口的类,并使用SQLite作为它的后备存储。由于映射只对SQLite有意义,因此我定义了映射。
问题是DapperExtensions反映到定义POCO寻找他们的ClassMappers的程序集中,但由于我的不同程序集,他们没有找到。
但是,您可以通过以下代码行告诉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();
}
}
}
完成并完成!有关于发现这一点的ZERO文档,所以我希望这有助于其他人!