Recomiendo tratar DbCommand
y sus amigos como si fueran interfaces al consumir API de base de datos. Con el objetivo de generalizar una API sobre varios proveedores de bases de datos, DbCommand
logra tan bien como IDbCommand
-o, posiblemente, mejor, porque incluye las tecnologías más nuevas como await
capaz Task
*Async()
miembros.
MS no puede agregar ningún método nuevo con nueva funcionalidad al IDbCommand
. Si tuvieran que agregar un método al IDbCommand
, es un cambio radical porque cualquiera es libre de implementar esa interfaz en su código y MS se ha esforzado mucho para preservar la compatibilidad ABI y API en el marco. Si expandieran las interfaces en una versión de .net, el código de cliente que funcionaba anteriormente dejaría de compilar y los ensamblados existentes que no se recompilan comenzarían a encontrar errores de tiempo de ejecución. Además, no pueden agregar los métodos adecuados *Async()
o Begin*()
a través de métodos de extensión sin realizar feos lanzamientos en DbCommand
detrás de escena (lo cual es una mala práctica, seguridad de tipo de última hora e introducción innecesaria de tiempo de ejecución dinámico).
Por otro lado, MS puede agregar nuevos métodos virtuales a DbCommand
sin romper ABI. Agregar nuevos métodos a una clase base podría considerarse romper la API (tiempo de compilación, no tan malo para romperse como tiempo de ejecución) porque si heredó DbCommand
y agregó un miembro con el mismo nombre, comenzará a recibir la advertencia CS0108: 'member1' hides inherited member 'member2'. Use the new keyword if hiding was intended.) . Por lo tanto, DbCommand
puede obtener las nuevas características con un impacto mínimo en el código de consumo que sigue las buenas prácticas (por ejemplo, la mayoría de las cosas seguirán funcionando siempre que no funcionen contra el sistema de tipos y métodos de llamada usando algo como myCommand.GetType().GetMethods()[3].Invoke(myCommand, …)
).
Una posible estrategia que MS podría haber utilizado para ayudar a las personas que les gusta las interfaces habría sido introducir nuevas interfaces con nombres como IAsyncDbCommand
y tener DbCommand
implementarlos. Ellos no han hecho esto. No sé por qué, pero probablemente no lo hicieron porque aumentaría la complicación y la alternativa de consumir directamente DbCommand
proporciona la mayoría de los beneficios a las interfaces consumidoras con pocas desventajas. Es decir, sería trabajo con poco rendimiento.
No veo 'IDbCommand.ExecuteScalarAsync()'. ¿Qué [documentación] (https://msdn.microsoft.com/en-us/library/system.data.idbcommand (v = vs.110) .aspx) está mirando? – binki
Oh, usted decía ['SqlCommand.ExecuteScalarAsync()'] (https://msdn.microsoft.com/en-us/library/system.data.sqlclient.sqlcommand.executescalarasync%28v=vs.110%29. aspx). Ya veo. – binki
@binki o ['DbCommand.ExecuteScalarAsync()'] (https://msdn.microsoft.com/en-us/library/hh223677 (v = vs.110) .aspx), que no es tan bueno como tenerlo en la interfaz, pero admite algún tipo de polimorfismo. – phoog