La inyección de dependencias es un patrón de diseño que facilita la programación. Le ahorra la molestia de instanciar objetos con dependencias complejas y le facilita la escritura de pruebas. Con la Biblioteca Couchbase.Extensions.DependencyInjection (GitHub)Con ASP.NET Core, puede utilizar clústeres y buckets de Couchbase en el marco de inyección de dependencias de ASP.NET Core.

En mi última entrada sobre caché distribuida con ASP.NETmencioné la librería DependencyInjection. La inyección de dependencia será explorada en profundidad en este post. Siéntete libre de seguir los ejemplos de código que he creado, disponibles en GitHub.

Configuración básica de Couchbase

En primer lugar, necesitarás un clúster de Couchbase Server en funcionamiento. Puedes hacerlo:

A continuación, deberá crear un cubo en Couchbase. Puede ser el bucket "travel-sample" que viene con Couchbase, o un bucket que crees tú mismo.

Si estás usando Couchbase Server 5.0, también necesitarás crear un usuario. Dale a ese usuario permiso de Cluster Admin, y dale el mismo nombre que al bucket, solo para mantener las cosas simples si estás siguiendo el proceso.

Inyección de dependencia con Couchbase.Extensions

En Couchbase.Extensions (GitHub) tiene como objetivo simplificar el trabajo con Couchbase Server y ASP.NET Core. Dependency Injection es solo una de estas extensiones.

Puede añadirlo a su proyecto ASP.NET Core con NuGet:

  • Mediante el Gestor de paquetes: Install-Package Couchbase.Extensions.DependencyInjection -Versión 1.0.2
  • Con la interfaz de usuario de NuGet
  • Utilice la línea de comandos .NET: dotnet add package Couchbase.Extensions.DependencyInjection --version 1.0.2

(La versión 1.0.2 es la más reciente en el momento de redactar este documento).

Couchbase extension for dependency injection on NuGet

A continuación, tendrá que hacer cambios en su Puesta en marcha clase en Inicio.cs.

En la entrada del blog sobre el almacenamiento en caché, codifiqué la configuración:

Esto está bien para demostraciones y entradas de blog, pero es probable que desee utilizar un archivo de configuración para un proyecto de producción.

Suponiendo que esté utilizando la opción por defecto appsettings.jsonactualice ese archivo para añadir una sección Couchbase:

Haciendo una sección "Couchbase", el módulo de inyección de dependencias leerá directamente del fichero de texto appsettings.json.

Inyección de constructores

Una vez configurada la inyección de dependencias, puedes empezar a inyectar objetos útiles en tus clases. Podrías inyectarlos en Controladores, servicios o repositorios.

He aquí un ejemplo de inyección en InicioControlador:

A continuación, hagamos un simple Visite sobre un documento conocido en "travel-sample". Este uso simbólico del SDK .NET de Couchbase mostrará la inyección de dependencias en acción. Haré un cambio en el Acerca de método de acción. En ese método, recuperará un documento de ruta y escribirá el número de equipo.

Y el resultado es:

Travel sample output of a single route

Éxito. La inyección de dependencia ha funcionado, y estamos listos para usar un bucket de Couchbase.

Si no utiliza "muestra-viaje", utilice una clave de su propio cubo.

Cubos con nombre

Puede utilizar la inyección de dependencias para un único cubo en lugar de tener que especificar el nombre cada vez.

Empiece por crear una interfaz que implemente INamedBucketProvider. Déjelo vacío. He aquí un ejemplo:

A continuación, en Startup.cs, asigna esta interfaz a un cubo utilizando AddCouchbaseBucket:

Ahora, el ITravelSampleBucketProvider en lugar del proveedor general.

Inyección de dependencias más compleja

Hasta este punto, sólo hemos utilizado la inyección de dependencia en los controladores. La inyección de dependencia comienza a pagar dividendos con gráficos de objetos más complejos y profundos.

Como ejemplo, imagina una clase de servicio que utiliza un bucket de Couchbase, pero también utiliza un servicio de correo electrónico.

A continuación, vamos a utilizar este servicio en un controlador (es decir, convirtiéndolo en una dependencia). Pero ten en cuenta que el controlador no utiliza directamente ni el cubo ni el servicio de correo electrónico.

Si tuviera que instanciar ServicioComplejo manualmente, tendría que instanciar al menos otros dos objetos. Sería algo como: new ComplexService(new BucketProvider(), new MyEmailService(). Son muchas cosas de las que tengo que hacer un seguimiento, y si cambia alguna dependencia, es mucho mantenimiento manual.

En su lugar, puedo hacer que ASP.NET Core utilice la inyección de dependencias para hacer todo esto por mí. De vuelta en Puesta en marcha:

Ahora, ASP.NET Core sabe cómo instanciar:

  • ITravelSampleBucketProvidergracias a Couchbase.Extensions.DependencyInjection
  • IEmailService - Le dije que usara MyEmailService
  • IComplexService - Le dije que usara ServicioComplejo

Por último, cuando AprobarControlador ASP.NET Core sabrá cómo hacerlo. Creará ServicioComplejo instanciando MyEmailService y ServicioComplejo. Inyectará ServicioComplejo automáticamente en el constructor de `ApproveController. El resultado final:

Complex service in action using dependency injection

Para ver el ejemplo completo, consulte la página código fuente que acompaña a esta entrada de blog en GitHub.

Limpieza

No olvides limpiar después. Cuando la aplicación ASP.NET Core se detenga, libera cualquier recurso que el SDK .NET de Couchbase esté utilizando. En el Configure en Startup, añada un parámetro de tipo IApplicationLifetime:

Dentro de ese Configure configure un método AplicaciónParada evento:

Resumen

La inyección de dependencia es un tema muy rico. Se han escrito libros enteros sobre ella y sus beneficios para tu aplicación. Esta entrada de blog apenas araña la superficie y ni siquiera cubre los beneficios de la testabilidad.

Couchbase.Extensions.DependencyInjection facilita la inyección de Couchbase en ASP.NET Core.

Si tiene preguntas o comentarios, no deje de consultar el Repositorio GitHub o el Foros del SDK .NET de Couchbase.

Si tiene alguna pregunta, déjeme un comentario a continuación o póngase en contacto conmigo en Twitter @mgroves.

Autor

Publicado por Matthew Groves

A Matthew D. Groves le encanta programar. No importa si se trata de C#, jQuery o PHP: enviará pull requests para cualquier cosa. Lleva codificando profesionalmente desde que escribió una aplicación de punto de venta en QuickBASIC para la pizzería de sus padres, allá por los años noventa. Actualmente trabaja como Director de Marketing de Producto para Couchbase. Su tiempo libre lo pasa con su familia, viendo a los Reds y participando en la comunidad de desarrolladores. Es autor de AOP in .NET, Pro Microservices in .NET, autor de Pluralsight y MVP de Microsoft.

12 Comentarios

  1. al intentar fijar
    ervices.AddCouchbase(Configuration.GetSection("Couchbase"));
    utilizando la configuración la llamada a : Configuration.GetSection("Couchbase"))
    devuelve null.

    1. Así que este no es el problema ..
      parece que los datos pasados corecttly pero cuando trato de llamar:
      bucketProvider.GetBucket("statistics", "");
      obtengo "Bootsrap exception"

      1. Arthur, ¿te importaría publicar tu pregunta junto con una vista más completa de tu código en el foro de Couchbase .NET? https://www.couchbase.com/forums/c/net-sdk

  2. Hola Matthew, ¿podrías actualizar el código del repositorio? Estoy teniendo problemas para utilizarlo en un proyecto ASP.Net Core 2.2.

    1. Claro, Lahbabi, acabo de actualizar el repositorio a .NET Core 2.2. Es probable que en realidad no tuvieras problemas con .NET Core 2.2. Mi suposición es que estás usando Couchbase Server 5 o más reciente, que cambió la forma en que funciona la autenticación. (El único problema con .NET Core que vi es que tenía algunas cosas de loggerFactory que están obsoletas desde .NET Core 1).

  3. Gracias Matthew, funciona, pude autenticarme pero no pude encontrar dónde hacer clic para obtener los datos... la muestra de viaje ya está instalada en la base de datos.

    1. Desde que he visto tu maravilloso y sencillo ejemplo de lista CRUD Gifts, esperaba ver algo similar pero esta vez usando Inyección de Dependencia. ¿Cómo puedo obtener semejante cosa con Inyección de Dependencia?

      1. Tienes razón en que este ejemplo no cubre todas las operaciones CRUD, pero el SDK no ha cambiado mucho desde que hice el vídeo al que te refieres. Si echas un vistazo a HomeController en este repositorio, verás que sigue siendo sólo un objeto IBucket el que se utiliza. https://github.com/couchbaselabs/blog-source-code/blob/master/Groves/078AspNetCoreDependencyInjection/src/CouchbaseDIExample/CouchbaseDIExample/Controllers/HomeController.cs#L42

        ¿Estaría interesado en un video mostrando .net core 2.2, inyección de dependencia, crud, con Couchbase todo junto?

        1. Yo no llegaría al punto de pedirte eso :) Supongo que poner la Inyección de Dependencias en acción con la API Rest en la demo de wishlist, incluso sólo modificando el código existente, sería muy útil para mí, y para muchos desarrolladores .Net Core que quieren tocar y apreciar el trato con Couchbase, La muestra de código de Wishlist con la introducción de N1QL es un punto de partida muy simple y muy conciso para empujar a Couchbase a una mayor popularidad en la comunidad de desarrolladores .Net Core, la muestra actual es un poco complicada con su ComplexService y EmailService, etc .. para aquellos que sólo quieren empezar.

          1. Gracias, es un buen comentario. Hace tiempo que no actualizo mi contenido sobre ASP.NET para principiantes, quizá sea el momento.

Dejar una respuesta