Concepto del principio de inversión de dependencias
El principio de inversión de dependencias recomienda que los módulos de alto nivel no deben depender de los de bajo nivel. Para realizar la dependencia se utilizan abstracciones (interfaces o clases abstractas).
Para realizar la dependencia se utiliza la inyección de dependencias enviando las clases necesarias a través de los constructores. Estas clases son siempre contratos, interfaces, no implementaciones concretas. Es muy importante que el principio de sustitución de Liskov se cumpla, ya que si dependendemos de interfaces que luego las clases que las implementan o extensiones de ellas no respetan el contrato, entonces tendríamos un problema.
Este principio nos permite modificar y sustituir implementaciones de forma segura. También permite realizar pruebas unitarias mucho más sencillas.
Con este principio en la cabeza, una clase de tipo CRUD en la que los accesos a base de datos está implementados en ella, se dividiría en dos clases, una con la lógica de cada método y otra que realice las ejecuciones contra la base de datos. A su vez se crearía una interface intermedia con los métodos necesarios implementar en la clase de acceso a base de datos. Una vez hecho esto la clase con la lógica tendrá un parámetro en la instanciación que permita introducir el interface, que será el que use en las llamadas a base de datos.
Con esta estructura, si necesitamos cambiar la base de datos a otro tipo de persistencia solo tendremos que cambiar la implementación sin tocar la lógica.