Ecosistema .NET: Scrutor - inyección de dependencias y decoraciones

Ecosistema .NET: Scrutor - inyección de dependencias y decoraciones


Scrutor es una librería pequeña, pero no por ello menos útil e interesante. Esta pequeña librería extiende de manera concisa y amigable la inyección de dependencias en el contenedor de dependencias de .NET. Muchos la conocen porque permite “escanear” un ensamblado y registrar tipos de forma automática, sin necesidad de registrar estos tipos uno por uno. En este escaneo te permite filtrar por interfaces, clases abstractas e incluso genéricos. Por ello, resulta bastante útil para aquellas bases de código que implementan el patrón repository a partir de genéricos.

Sin embargo, esta no es la única capacidad de Scrutor. En este artículo te hablaré de cómo implementar el patrón “decorator” y el patrón “pipeline” con inyección de dependencias y los métodos facilitadores de Scrutor.


Docorator Pattern con Scrutor

El patrón decorator consiste en envolver un objeto para añadirle funcionalidades o comportamiento adicional de forma dinámica. Scrutor logra esto con la inyección de dependencias y su método “.Decorate”. Veámoslo con un ejemplo:

Imagina que tienes una interface “IOrderService” con un método “PlaceOrderAsync” y una implementación “OrderService” con la lógica de negocio central. Ahora quieres extender o “decorar” esa implementación para hacer “Logging” de la orden. Para que esto se logre con el patrón decorator, se debe tener un código parecido al siguiente:

LogginOrderService

Como se puede ver, el decorador también implementa IOrderService, pero además tiene una referencia de IOrderService en el atributo “_inner”, que recibe por inyección de constructor. Luego, en su propia implementación del método PlaceOrderAsync, primero llama a la implementación de _inner y posterior a esto implementa su propio código, logrando de esta manera envolver o decorar el comportamiento inicial. En la clase Program.cs se debe tener un código como el siguiente:

Scrutor: Metodo Decorate

En este código se ejemplifica cómo se debe registrar la implementación base y luego los decoradores. Se debe respetar que la primera línea sea la implementación base; de lo contrario, los decoradores tendrán problemas para resolver. Con esto, Scrutor y su método Decorate se encargan de toda la tubería interna.


Pipeline Pattern con Scrutor

El patrón pipeline se usa para implementar workflows o pasos que deben ejecutarse normalmente en orden o bajo un criterio parecido. Este se puede implementar en C# y .NET sin necesidad de Scrutor, pero Scrutor facilita en gran manera la inyección de cada paso del workflow utilizando su método “.Scan”. Veamos un ejemplo de código:

Pipeline con IEnumerable y .NET DI

En la línea 9 podemos ver la base del patrón pipeline implementado con el clásico “IEnumerable” y que se inyecta por constructor; con esto, cualquier implementación de “IOrderRule” se inyectará automáticamente en el objeto enumerable. Luego, en el método Validate, desde la línea 17, consiste en aplicar uno a uno la implementación de IOrderRule con la estructura de iteración de preferencia, en este caso un foreach. Para terminar, Scrutor nos ayudaría en este patrón con el siguiente código:

Escaneo de Scrutor para inyectar toda implementación de IOrderRule

Repositorio de ejemplo usando Scrutor

https://github.com/mvasquezj/scrutordecoratorsypipelines.git


Sígueme en Linkedin para estar al tanto de mis publicaciones y novedades

Referencias