2011-03-12 11 views
12

Soy un recauchutado de Java bastante nuevo para C#. Espero no meterme en problemas cuando genere un montón de código DML en las próximas semanas.¿Por qué no DbConnection en lugar de SqlConnection u OracleConnection?

Estoy acostumbrado a la idea de usar clases abstractas de JDBC como Connection, Statement y similares. C# ofrece clases abstractas similares como DbConnection, DbCommand, etc. en el espacio de nombres System.Data.Common.

Pero, la mayoría de los ejemplos que he visto, tanto en la documentación de MS como en otros libros, usan las clases concretas: SqlConnection, OracleCommand, etc. Este tipo de concreción incluso aparece en la documentación mySQL.

¿Cuál es la mejor práctica en esta área? ¿Hay alguna razón poderosa para elegir clases concretas específicas de servidor de tablas en lugar de clases abstractas para este propósito? (Soy consciente de los peligros del downcasting abstracto al concreto, por supuesto).

Respuesta

13

Las clases abstractas no formaban parte de las primeras versiones del framework, sino que se introdujeron en la versión 2.0. Se escribieron muchos ejemplos antes o se basan en ejemplos que se escribieron antes.

El uso de clases de concreto o abstractas es principalmente una cuestión de gusto. Es una buena idea escribir código que pueda funcionar con cualquier base de datos, pero mi experiencia es que no cambias los sistemas de bases de datos con mucha frecuencia, y si lo haces hay tantos cambios que debes hacer que no importa mucho si usaste clases abstractas o no.

8

La mayoría de las clases ADO.NET específicas de la base de datos tienen sobrecargas y/o métodos y propiedades adicionales que son específicos para ese controlador de base de datos.

El uso de clases concretas como SqlConnection y OracleConnection facilita el acceso a las funciones específicas del controlador.

4

En general, cuando sabe qué base de datos está utilizando su empresa o usted, se dirige a ese tipo de base de datos específico. Si conoce su Oracle, entonces usa las clases relacionadas con Oracle, si es SQLClient, luego usa SqlClient, y así sucesivamente.

Ahora, si no está seguro de qué tipo es, entonces buscaría una forma de referencia genérica/generalizada, para que pueda lograr su objetivo sin tener que preocuparse por el tipo de base de datos. A la inversa, escribiría un montón de enunciados condicionales para verificar el tipo de base de datos y luego realizar operaciones según el mismo.

Un escenario común para ayudarlo a entender sería: Si está escribiendo código, para que su usuario final pueda cambiar el archivo de configuración e ingresar una cadena de conexión para conectarse a la base de datos, ¿cuál proporcionaría usted estaría utilizando? Este es el lugar donde DbFactory y sus clases relevantes son útiles, donde en lugar de escribir fragmentos de código, utilizas la clase genérica (algo así como supongo) para manejar todo.

Tenga en cuenta que si se dirige a un proveedor específico, tendrá un mejor rendimiento (ya que DbFactory debe resolver su proveedor internamente antes de manejarlo), pero si no está seguro del proveedor del usuario final, entonces su código ser grande y no ser eficiente.

Llegando a su otra pregunta: Resumen o concreto. Está hasta ti y de nuevo, está basado en el ESCENARIO. La ventaja del resumen es que puede FORCE/ATACAR al cliente contra reglas (como una interfaz) y generalizar cosas, así como utilizar el tipo de conversión (similar a clases concretas) para acceder a métodos de subclase para hacer algo (consultar sobre este tema si puedes.Utilizando el polimorfismo de tiempo de ejecución, puede usar un objeto y llamar a un método que tenga diferentes implementaciones en diferentes clases subclasificadas a esta clase principal, de la que nunca tendrá que preocuparse, como el cálculo de interés tal vez interés simple e interés compuesto para un banco, que son calculados por la clase respectiva, pero no te importa, ya que solo dices: GetInterest() y boom!).

Apuntando ambos, diría que, en un escenario donde no se conoce el tipo de Base de datos que está utilizando el usuario final, y sin conocer la cadena de conexión, es posible que desee obligar al usuario final a implementar su clase, IMPLEMENTE su método abstracto para inicializar la cadena de conexión y luego realice la operación necesaria para obtener una salida.

Espero que ayude.

Cuestiones relacionadas