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

C# 为Dapper提供一个要映射到的类实例,而不是总是实例化一个新实例?,c#,.net,orm,dapper,C#,.net,Orm,Dapper,我查看了源代码,没有发现任何东西(尽管我不擅长IL),但我想看看是否有一种方法可以为Dapper提供一个类实例,而不是总是实例化一个新实例。原因是我们有时可能会对两个不同的存储过程进行两个单独的调用—一个返回“实体”的某些列,另一个返回其他列。然而,与使用我们在第一次调用中收到的实体的第二次查询不同,我们得到了本质上相同实体的两个实例。Dapper最好使用现有的实体类并将查询结果映射到该现有类 有没有办法拦截Dapper的类实例化,以便在需要时为其提供现有实例?好问题。目前,它允许您指示特定的构

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


有没有办法拦截Dapper的类实例化,以便在需要时为其提供现有实例?

好问题。目前,它允许您指示特定的构造函数,但它总是
new
s:

 il.Emit(OpCodes.Newobj, specializedConstructor);
我们所能做的就是可以指定构造函数或
静态
工厂方法;我怀疑这只是对核心materializer代码的三行更改,再加上一些其他地方。这并非不可能,但随后它会遇到一些问题,比如调用上下文:dapper如何向工厂提供调用方指定的上下文。再次强调:一切可能(protobuf net做的事情几乎相同)


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

谢谢你,马克!背景是一个值得关注的问题。简单想一想,但是向Query()方法添加一个可选的Func参数作为实例化回调如何?如果不设置,Dapper将返回到always new()。@Amberite好吧,它比这要复杂一点——特别是考虑到多类型方法的存在。让我考虑一下最合适的实施方式。特别要注意的是,在基于IL的元编程中不能方便地使用委托实例;这是可以做到的,但是需要创建一个包装器实例和支持字段,如果Func接受一个常规类型参数,那么我不认为多重映射方法会有问题吗?对于每种类型,将调用一次回调。但IL问题肯定是个大问题。现在我将标记这个问题的答案。我会密切关注Github回购协议,如果你有什么想法,我也会关注这个帖子:)