2012-05-01 1 views
6

Je suis vraiment impressionné par Dapper micro OR/M, je voudrais vraiment l'utiliser comme un compagnon côte à côte de certains OR/M à part entière, et mon être évantuellement à la place de celui-ci. Je n'ai pas compris de toute façon s'il y avait une stratégie pour désérialiser une hiérarchie de db: par exemple l'objet retourné pour une rangée d'enregistrements dépendrait d'un champ (appelé discriminateur dans NH par exemple). En outre, la hiérarchie peut diviser davantage de tables via une jointure, de sorte que le type qui représente la ligne dépendra de l'existence de l'enregistrement dans l'autre table. Avoir une hiérarchie représentée par un mélange des deux stratégies ci-dessus serait quelque chose que NH par exemple ne supporte pas, mais qui existe dans la «vie relationnelle». Donc, les questions:en utilisant dapper pour remplacer un OR/M

  • Dapper gérer un tel scénario?
  • Ce scénario a-t-il permis d'améliorer les performances de Dapper en termes de performances?

Un autre sujet est la mise en cache. Dapper cache pour les requêtes est un peu trop agressif, ne serait pas mieux d'avoir une "session comme le contexte" et avoir un cache de requête pour chaque session, ou cela va-t-il encore offenser les principales motivations Dapper?

Répondre

5

Au moment Dapper ne supporte pas la logique de construction personnalisée, je suppose que ce que vous demandez est quelque chose comme:

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); 

Nous avons décidé de mettre en œuvre une telle cause logique nous n'a jamais vraiment eu à résoudre un problème comme celui-ci dans la vraie vie. Il introduit également une bonne quantité de complexité interne et une bonne quantité de complexité externe (comme vous devez activer post is Question).

Je ne suis pas catégoriquement contre l'inclusion de ce type de fonctionnalité si vous pouvez faire un bon argument pour l'inclusion et le correctif est simple. Je suis également tout à fait pour ajouter des crochets dans Dapper pour vous permettre d'injecter ce genre de fonctionnalité. En ce qui concerne la stratégie de mise en antémémoire, nous constatons qu'en général, nous n'utilisons jamais le cache, il ne se passe que des bloings si vous utilisez abusivement dapper, par exemple, en générant un SQL non paramétré. Je supporte totalement l'ajout d'un hook qui vous permettrait de spécifier votre propre fournisseur de cache au lieu du ConcurrentDictionary utilisé maintenant.

+0

Merci! Je suis d'accord avec le cache, en utilisant/regardant le code je pense qu'il n'y a pas vraiment besoin d'en avoir un autre. Je vais avoir la question de sous-classement si je passe de NH à dapper pour mon prochain projet, je vais essayer de résoudre, peut-être avoir une méthode statique sur le POCO avec des paramètres injectés du désérialiseur? –

+0

personnellement, je préfère l'explicite de l'usine locator sur la convention pour ce cas –

+0

cela ne nuit pas un peu à la performance? –

Questions connexes