为 Dapper 提供一个要映射到的 class 实例,而不是总是实例化一个新实例?
Provide Dapper with a class instance to map to instead of always instantiating a new one?
我查看了源代码但没有找到任何东西(虽然我不擅长 IL),但我想看看是否有办法为 Dapper 提供一个 class 实例而不是它总是实例化一个新的。这样做的原因是我们有时可能会对两个不同的存储过程进行两次单独的调用 - 一个 returns 一个 'entity' 的某些列,另一个 returns 其他列。但是,我们没有使用我们在第一次调用中收到的实体进行第二次查询,而是获得了本质上相同实体的两个实例。 Dapper 最好使用现有实体 class 并将查询结果映射到现有实体 class.
有没有办法拦截 Dapper 的 class 实例化,以便在需要时为其提供现有实例?
问得好。目前,它允许您指定一个特定的构造函数,但它总是 new
s:
il.Emit(OpCodes.Newobj, specializedConstructor);
我们可以做的是使指定构造函数或static
工厂方法成为可能;我怀疑这只是对核心实体化器代码以及其他几个地方的三行更改。并非不可能,但随后会遇到诸如 calling-context 之类的问题:dapper 如何向工厂提供调用者指定的上下文。再次重申:一切皆有可能(protobuf-net 做的事情几乎相同)。
但是 none 今天存在。也不是不可能。
我查看了源代码但没有找到任何东西(虽然我不擅长 IL),但我想看看是否有办法为 Dapper 提供一个 class 实例而不是它总是实例化一个新的。这样做的原因是我们有时可能会对两个不同的存储过程进行两次单独的调用 - 一个 returns 一个 'entity' 的某些列,另一个 returns 其他列。但是,我们没有使用我们在第一次调用中收到的实体进行第二次查询,而是获得了本质上相同实体的两个实例。 Dapper 最好使用现有实体 class 并将查询结果映射到现有实体 class.
有没有办法拦截 Dapper 的 class 实例化,以便在需要时为其提供现有实例?
问得好。目前,它允许您指定一个特定的构造函数,但它总是 new
s:
il.Emit(OpCodes.Newobj, specializedConstructor);
我们可以做的是使指定构造函数或static
工厂方法成为可能;我怀疑这只是对核心实体化器代码以及其他几个地方的三行更改。并非不可能,但随后会遇到诸如 calling-context 之类的问题:dapper 如何向工厂提供调用者指定的上下文。再次重申:一切皆有可能(protobuf-net 做的事情几乎相同)。
但是 none 今天存在。也不是不可能。