2015-04-01 77 views
2

我已经看过了源代码,我没有找到任何东西(虽然我不是很擅长IL),但我想看看是否有一种方法可以提供Dapper类实例,而不是总是实例化一个新的一。原因是我们有时可能会对两个不同的存储过程进行两次单独调用 - 一次返回一个“实体”列,另一个返回其他列。但是,我们不是使用我们在第一次调用中收到的实体进行第二次查询,而是获得两个本质上相同的实体。对于Dapper来说,使用现有的实体类并将查询结果映射到现有的类会更加可取。向Dapper提供一个类实例来映射到,而不是总是实例化一个新实例?

是否有任何方法来拦截Dapper的类实例化,以便在需要时为其提供现有实例?

回答

1

优秀的问题。目前,它可以让你指示特定构造,但它总是new S:

il.Emit(OpCodes.Newobj, specializedConstructor); 

我们可能做的是使人们有可能指定一个构造函数或static工厂方法;我怀疑这只是对核心实现者代码和其他一些地方的三行更改。不是不可能的,但它然后进入问题如调用上下文:如何向工厂提供调用者指定的上下文。再说一遍:所有可能的(protobuf-net几乎都是一样的)。

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

+0

谢谢马克!情况是一个很好的问题。只是一个快速的想法,但是如何为可充当实例化回调的Query <>()方法添加一个可选的Func 参数?如果没有设置,Dapper会回退到总是新的()。 – Amberite 2015-04-01 22:10:26

+0

@Amberite好吧,它比这更复杂 - 特别是考虑到多类型方法的存在。让我想想最适合的实现。尤其要注意的是,委托实例不能方便地用于基于IL的元编程;它可以完成,但涉及创建包装实例和支持领域等 – 2015-04-01 22:15:37

+0

如果Func <>接受一个常规的类型参数,那么我不认为多地图方法会是一个问题?每种类型都会调用一次回调函数。但是IL问题肯定是一个大问题。我现在要回答这个问题。我会继续关注Github回购以及如果你想出一些东西,这个线程:) – Amberite 2015-04-01 22:23:15