为 Dapper 提供一个要映射的类实例,而不是总是实例化一个新实例?

Posted

技术标签:

【中文标题】为 Dapper 提供一个要映射的类实例,而不是总是实例化一个新实例?【英文标题】:Provide Dapper with a class instance to map to instead of always instantiating a new one? 【发布时间】:2015-04-01 21:25:18 【问题描述】:

我查看了源代码,但没有找到任何东西(虽然我不擅长 IL),但我想看看是否有办法为 Dapper 提供一个类实例,而不是总是实例化一个新的一个。这样做的原因是我们有时可能会对两个不同的存储过程进行两次单独的调用——一个返回“实体”的某些列,另一个返回其他列。但是,我们没有使用我们在第一次调用中收到的实体进行第二次查询,而是获得了本质上相同实体的两个实例。 Dapper 最好使用现有的实体类并将查询结果映射到现有的类。

有什么方法可以拦截 Dapper 的类实例化,以便在需要时为其提供现有实例?

【问题讨论】:

【参考方案1】:

很好的问题。目前,它允许你指定一个特定的构造函数,但它总是news:

 il.Emit(OpCodes.Newobj, specializedConstructor);

我们可以做的是可以指定构造函数或static 工厂方法;我怀疑这只是对核心实现器代码的三行更改,以及其他一些地方。并非不可能,但随后会涉及 calling-context 之类的问题:dapper 如何为工厂提供调用者指定的上下文。再说一遍:一切皆有可能(protobuf-net 做的几乎一样)。

但今天这些都不存在。这不是不可能的。

【讨论】:

谢谢马克!上下文是一个很好的问题。只是一个快速的想法,但是如何将一个可选的 Func 参数添加到 Query() 方法中作为实例化回调?如果未设置,Dapper 将回退到始终 new()。 @Amberite 好吧,它比这复杂一点——尤其是考虑到多类型方法的存在。让我考虑最合适的实施方式。特别要注意的是,委托实例不能方便地用于基于 IL 的元编程;它可以完成,但涉及创建包装器实例和支持字段等 如果 Func 接受常规的 Type 参数,那么我认为多映射方法不会有问题吗?每种类型都会调用一次回调。但 IL 问题肯定是一个大问题。我现在将这个问题标记为已回答。如果你有什么想法,我会关注 Github repo 和这个线程 :)

以上是关于为 Dapper 提供一个要映射的类实例,而不是总是实例化一个新实例?的主要内容,如果未能解决你的问题,请参考以下文章

Dapper-小型ORM之王(C#.NET)

在 Java 中,是不是可以创建一个类型安全的类映射到其类的实例?

有没有办法使用 Dapper 将列名映射到我的实体的属性?

Dapper 多重映射 - 集合为空

在Mapping时向Automapper提供构造函数参数

Dapper 中的多重映射。在 SpiltOn 中接收错误