您如何注册 DapperExtension ClassMapper 子类以便使用它们?
How do you register DapperExtension ClassMapper subclasses so they are used?
我刚刚开始使用 DapperExtensions,它看起来很有前途。但是,我对如何处理注册 ClassMapper subclasses 感到困惑。
我有一个自定义的 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 的映射器 class
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<>);
但我不确定如何同时使用另一个。我错过了什么?
好的,我明白了。问题是因为我使用的是 IoC,而我的 POCO 与映射位于不同的程序集中。
简而言之,我的模型不知道,也不关心它存储在何处或如何存储。它只定义了一个接口来描述它需要如何与该存储交互。我的 DAL 定义了一个 class,它实现了该接口并使用 SQLite 作为后备存储。由于映射仅对 SQLite 有意义,因此我在其中定义了映射。
问题是 DapperExtensions 反映到定义 POCO 的程序集中寻找它们的 ClassMappers,但由于我的在不同的程序集中,所以没有找到它们。
但是,您可以通过以下代码行告诉 DapperExtensions 搜索外部程序集...
DapperExtensions.DapperExtensions.SetMappingAssemblies(new[]{
assemblyA, assemblyB, ...assemblyN
});
因此,由于我的映射定义在与我的静态映射器 class(具有静态 '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 中指定 table 名称,所以实际上不需要我的 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();
}
}
}
大功告成!关于发现这一点的文档为零,所以我希望这对其他人有帮助!
我刚刚开始使用 DapperExtensions,它看起来很有前途。但是,我对如何处理注册 ClassMapper subclasses 感到困惑。
我有一个自定义的 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 的映射器 class
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<>);
但我不确定如何同时使用另一个。我错过了什么?
好的,我明白了。问题是因为我使用的是 IoC,而我的 POCO 与映射位于不同的程序集中。
简而言之,我的模型不知道,也不关心它存储在何处或如何存储。它只定义了一个接口来描述它需要如何与该存储交互。我的 DAL 定义了一个 class,它实现了该接口并使用 SQLite 作为后备存储。由于映射仅对 SQLite 有意义,因此我在其中定义了映射。
问题是 DapperExtensions 反映到定义 POCO 的程序集中寻找它们的 ClassMappers,但由于我的在不同的程序集中,所以没有找到它们。
但是,您可以通过以下代码行告诉 DapperExtensions 搜索外部程序集...
DapperExtensions.DapperExtensions.SetMappingAssemblies(new[]{
assemblyA, assemblyB, ...assemblyN
});
因此,由于我的映射定义在与我的静态映射器 class(具有静态 '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 中指定 table 名称,所以实际上不需要我的 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();
}
}
}
大功告成!关于发现这一点的文档为零,所以我希望这对其他人有帮助!