Dapper micro OR/M给我留下了深刻的印象,我真的很想将它作为一些完全成熟的OR/M的并肩伴侣使用它,而且我将逐渐取而代之.无论如何,如果有一些策略要从db反序列化层次结构,我也没想到:例如,记录集行的返回对象将取决于一个字段(例如NH中所谓的'discriminator').此外,层次结构可以通过连接拆分更多表,因此表示该行的类型将取决于另一个表中记录的存在.具有由上述两种策略的混合物表示的层次结构将是例如NH不支持但是存在于"关系生活"中的事物.所以问题:
另一个话题是缓存.用于查询的Dapper缓存有点过于激进,拥有一些"类似上下文的会话"并且每个会话都有一个查询缓存会不会更好,或者这会再次冒犯主要的Dapper动机?
目前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);
Run Code Online (Sandbox Code Playgroud)
我们决定不执行这样的逻辑,因为我们在现实生活中从未真正解决过这样的问题.它还引入了相当多的内部复杂性和相当大的外部复杂性(因为您需要打开post is Question
).
如果你可以提出一个很好的论据并且补丁很简单,我并不是绝对反对包括这种功能.我也是在Dapper中添加钩子以允许你注入这种功能.
至于缓存策略,我们发现在一般情况下,我们永远不会膨胀缓存,只有当您滥用dapper时才会出现膨胀,生成未参数化的SQL.我完全支持添加一个钩子,允许你指定自己的缓存提供者,而不是ConcurrentDictionary
现在使用的.