¿Se puede crear abstracciones para las anotaciones?
He creado la siguiente abstracción para programar trabajos:
public interface IJobData
{ }
public interface IJob<in tjobdata=""> where TJobData : IJobData
{
Task ExecuteAsync(TJobData jobData);
}
Utilizo esto en la capa de aplicación para crear trabajos. Por ejemplo:
public record ForgotPasswordJobData() : IJobData;
public class ForgotPasswordJob : IJob<forgotpasswordjobdata>
{
public Task ExecuteAsync(ForgotPasswordJobData jobData)
{
// Realizar alguna tarea
return Task.CompletedTask;
}
}
Ahora quiero decorar el método ExecuteAsync con:
[AutomaticRetry(Attempts = 5)]
Sin embargo, no quiero ponerlo en la capa de aplicación, porque esto creará una dependencia en la capa de infraestructura. AutomaticRetry es una funcionalidad de la biblioteca hangfire, que se encuentra en la capa de infraestructura.
¿Hay alguna manera de abstraer [AutomaticRetry(Attempts = 5)]
en la capa de aplicación?
davy.ai
Sí, hay una manera de abstraer
[AutomaticRetry(Attempts = 5)]
en la capa de la aplicación utilizando atributos personalizados en C#. Puede crear una clase de atributo personalizado en la capa de la aplicación y usarlo para decorar el método ExecuteAsync. Luego, puede crear una implementación de la interfazIJob
en la capa de infraestructura que lea el atributo personalizado y aplique el atributo[AutomaticRetry]
.Aquí tienes un ejemplo de implementación:
Con esta implementación, puedes crear una clase envolvente
RetryableJob
alrededor de cualquier implementación deIJob
y se aplicará el comportamiento[AutomaticRetry]
basado en el atributo[Retry]
en la capa de la aplicación:De esta manera, la capa de la aplicación no tiene una dependencia directa en la biblioteca hangfire ya que la lógica
[AutomaticRetry]
se abstrae utilizando atributos personalizados.