2012-05-01 24 views
6

Estoy realmente impresionado por Dapper micro OR/M, realmente me gustaría usarlo como compañero de lado a lado de algún O/M totalmente desarrollado, y mi ser evangélicamente en lugar de eso No resolví de todos modos si hay alguna estrategia para deserializar una jerarquía de db: por ejemplo, el objeto devuelto para una fila del conjunto de registros dependería de un campo (el llamado 'discriminador' en NH, por ejemplo). Además, la jerarquía puede dividir más tablas a través de una unión, por lo que el tipo que representa la fila dependerá de la existencia del registro en la otra tabla. Tener una jerarquía representada por una mezcla de las dos estrategias anteriores sería algo que NH, por ejemplo, no admite, pero que existe en la "vida relacional". Entonces las preguntas:usando dapper para reemplazar un OR/M completo

  • ¿Dapper maneja tal escenario?
  • ¿este escenario desea los esfuerzos de Dapper en términos de rendimiento?

Otro tema es el almacenamiento en caché. Dapper Cache para consultas es un poco agresivo, ¿no sería mejor tener una "sesión como contexto" y tener un caché de consultas para cada sesión, o esto ofendería las principales motivaciones de Dapper?

Respuesta

5

Por el momento Dapper no es compatible con la lógica de la construcción de encargo, supongo que lo que está pidiendo es algo así como:

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

Decidimos contra la implementación de dicha causa lógica que en realidad nunca tuvo que resolver un problema como este en la vida real. También presenta una buena cantidad de complejidad interna y una cantidad considerable de complejidad externa (ya que debe activar post is Question).

No estoy categóricamente en contra de incluir este tipo de características si puede hacer un buen argumento para la inclusión y el parche es simple. También estoy a favor de agregar ganchos en Dapper para permitirle inyectar este tipo de funcionalidad.

En cuanto a la estrategia de almacenamiento en caché, encontramos que, en general, nunca abombamos la memoria caché, la distensión solo ocurre si malgastas a dapper digamos, generando SQL no parametrizado. Apoyo totalmente la adición de un gancho que le permita especificar su propio proveedor de caché en lugar del ConcurrentDictionary que se usa ahora.

+0

Gracias! Estoy de acuerdo con el caché, al seguir usando/buscando el código creo que no hay una necesidad real de tener otro. Tendré el problema de subclases si cambio de NH a apuesto para mi próximo proyecto, intentaré resolverlo, ¿quizás tener un método estático en el POCO con los parámetros inyectados del deserializador? –

+0

Personalmente, prefiero la precisión del localizador de fábrica por sobre la convención para este caso –

+0

¿no perjudica esto un poco el rendimiento? –

Cuestiones relacionadas