Dapper micro OR / M给我留下了深刻的印象,我真的很想将它作为一些完全成熟的OR / M的并肩伴侣使用它,而且我将逐渐取而代之。无论如何,如果有一些策略要从db反序列化层次结构,我也没想到:例如,记录集行的返回对象将取决于一个字段(例如NH中所谓的'discriminator')。此外,层次结构可以通过连接拆分更多表,因此表示该行的类型将取决于另一个表中记录的存在。具有由上述两种策略的混合物表示的层次结构将是例如NH不支持但是存在于“关系生活”中的事物。所以问题:
另一个话题是缓存。用于查询的Dapper缓存有点过于激进,不会更好地拥有一些“类似上下文的会话”并且每个会话都有一个查询缓存,或者这会再次冒犯主要的Dapper动机?
答案 0 :(得分: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
。