Se necesita una forma integrada de agregar la Resiliencia a Deadlock a Dapper para repositorios existentes sin alterarlos.
Necesito hacer que todos los repositorios existentes (alrededor de 30+) sean tolerantes a fallas en cuanto a los bloqueos y puedan recuperarse de ellos con un enfoque de registro y espera.
He logrado hacerlo con éxito: He respondido a continuación con una política personalizada de SqlResiliencyPolicy utilizando Polly después de investigar y adaptarla al proyecto.
Pero, lo que busco: La forma actual (indicada a continuación) me exige o bien envolver todas las llamadas existentes a la base de datos con await _policy.ExecuteAsync
O bien proporcionar sobrecargas personalizadas que acepten el parámetro IAsyncPolicy
y luego llamen al método previsto. Una especie de extensión a IDbConnection:
public static Task<T> GetAsync<T>(this IDbConnection connection, object primaryKey, IAsyncPolicy policy) =>
return await _policy.ExecuteAsync(async () => GetAsync<T> (...));
De ambas formas, necesito cambiar todos mis 30+ repositorios. Sin embargo, ¿hay alguna forma integrada en Dapper/otros enfoques donde podemos
“configurar una política en el inicio y, mágicamente, todas las llamadas a la base de datos con Dapper se vuelven resistentes (vuelven a su mecanismo tolerante a fallas), similar a las formas de la resiliencia de los clientes HTTP, donde se agrega una política mientras se registra un cliente”
Con esto: los cambios en el código se reducen al mínimo, no es necesario tocar los repositorios, solo el inicio.
Tengo un enfoque a continuación y necesito una mejora sobre él.
davy.ai
Una manera de lograr esto es utilizar los métodos de extensión IDbConnection en Dapper.Contrib para aplicar automáticamente la política de Polly a todas las llamadas a la base de datos.
Primero, crea una política personalizada de resiliencia de Sql utilizando Polly, como mencionaste. Luego, crea un método de extensión IDbConnection que envuelve todas las llamadas a los métodos de Dapper.Contrib con la política de Polly. Aquí hay un ejemplo:
De manera similar, puedes crear métodos de extensión para otros métodos de Dapper.Contrib como GetAsync, InsertAsync, UpdateAsync, etc.
En el inicio de tu aplicación, puedes configurar la política y registrar los métodos de extensión IDbConnection de la siguiente manera:
Con este enfoque, puedes minimizar los cambios de código y solo necesitas modificar el inicio de tu aplicación para hacer que todos los repositorios existentes sean tolerantes a fallos debido a un deadlock.