Inyeccion de dependencias de .NET Core – #1 DeadLocks

A lo largo de esta serie de post que hoy empieza no quiero repetir muchos de los elementos que ya tenemos en la propia documentación oficial de .NET Core. El nuevo portal de documentación Microsoft Docs ya tiene mucha información sobre Quick Starts y los elementos más comunes, por lo que escribir sobre eso creo que no aporta demasiado. Incluso en el libro de introducción a .NET Core puedes ver muchos conceptos y prácticas más allá de estos “comienzos”.  En esta serie de entradas me gustaría hablar de ciertos aspectos problemáticos o con los que podemos tener problemas si no los tenemos en consideración.

# DeadLocks

Procura no usar nunca un resolución asíncrona dentro de un método de registro de factoría. Si lo haces podrás caer en un dead lock de una forma bastante sencilla. Para ilustrarlo, usaremos un pequeño ejemplo, imagina las siguientes clases:

Ahora, en nuestro metodo Configure, realizaremos el siguiente registro:
 Bien, vamos a explicar un momento este código. Tenemos un registro de nuestra clase DependencyClass y un registro de SomeClass en la cual queremos especificar como construímos la misma, usando el método GetDependencyClassAsync.Pues bien, si ejecutamos esto veremos como tenemos un magnifico dead lock que nos bloqueara de forma infinita la ejecución de nuestro código.
Nota: Depurar esto puede ser un poco tedioso, pero si le gusta, la razon principal es que tenemos un precioso ReaderWriterLockSlim con un dead lock.
Por suerte, solucionar este tipo de problemas es tan fácil como seguir la práctica de no usar nunca la asincronía como parte de la especificación de nuestros métodos de factoría. Dicho esto, entonces el ejemplo anterior lo podemos arreglar de una forma tan sencilla como sigue en el siguiente ejemplo de código.

 

 Saludos
Unai Zorrilla Castro

 

2 comentarios en “Inyeccion de dependencias de .NET Core – #1 DeadLocks”

  1. Me surge una preguntilla. ¿Hay algún caso en el que sea beneficioso obtener una dependencia asíncronamente? Por más que le doy vueltas, no se me ocurre ninguno.

    Entiendo que lo que intentas transmitir es que nos aseguremos de que no haya nada asíncrono por accidente en la construcción de la dependencia…

    Gracias por tus posts, Unai.

    1. El otro día me preguntaban lo mismo en tuiter, imagina cualquier construcción que tenga dependencia de un valor por ejemplo de configuración que tengas que obtener previamente.

Deja un comentario

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *