6

Dapper micro OR/M 给我留下了深刻的印象,我真的很想将它用作一些完全成熟的 OR/M 的并排伴侣,并最终取代它。无论如何,我没有弄清楚是否有一些策略可以从 db 反序列化层次结构:例如,记录集行的返回对象将取决于一个字段(例如,NH 中所谓的“鉴别器”)。此外,层次结构可以通过连接拆分更多表,因此表示行的类型将取决于另一个表中记录的存在。具有由上述两种策略的混合表示的层次结构将是 NH 例如不支持的东西,但存在于“关系生活”中。所以问题:

  • Dapper 能处理这种情况吗?
  • 这种情况是否会削弱 Dapper 在性能方面的努力?

另一个主题是缓存。用于查询的 Dapper 缓存有点激进,拥有一些“类似会话的上下文”并为每个会话都有一个查询缓存会不会更好,或者这会再次冒犯 Dapper 的主要动机吗?

4

1 回答 1

5

目前 Dapper 不支持自定义构造逻辑,我猜你要求的是这样的:

class Post {}
class Question : Post { .. }
class Answer : Post { ... }

Func<IDbDataReader, Func<IDbDataReader, Post>> factoryLocator
        = ... my magic factory locater; 

cnn.Query<Post>(@"
select * from Posts p 
left join Questions q on q.Id = p.Id 
left join Answers a on a.Id = p.Id", factoryLocator: factoryLocator);

我们决定不实施这样的逻辑,因为我们在现实生活中从来没有真正解决过这样的问题。它还引入了相当数量的内部复杂性和相当数量的外部复杂性(因为您需要打开post is Question)。

如果您可以为包含提供一个很好的论据并且补丁很简单,我不会断然反对包含这种功能。我也完全赞成在 Dapper 中添加钩子以允许您注入这种功能。

至于缓存策略,我们发现在一般使用中我们永远不会使缓存膨胀,只有当您误用 dapper 时才会发生膨胀,例如生成未参数化的 SQL。我完全支持添加一个允许您指定自己的缓存提供程序而不是ConcurrentDictionary现在使用的挂钩。

于 2012-05-09T06:13:59.283 回答