По моему мнению, вы можете попробовать добавить JobFilter как TypeFilter, и он автоматически вставит зависимости, если таковые имеются, в конструктор вашего LogEverythingAttribute
, поэтому изменив пример из предоставленной вами ссылки:
public class EmailService
{
[TypeFilter(typeof(LogEverything))]
public static void Send() { }
}
GlobalJobFilters.Filters.Add(new TypeFilterAttribute(typeof(LogEverythingAttribute())));
Отказ от ответственности: я не проверял вышеуказанное самостоятельно, поэтому, пожалуйста, дайте мне знать, если это сработает.
Отредактировано
Попробуйте настроить Hangfire, как показано ниже в ConfigureServices
, и посмотрите, работает ли это.
services.AddHangfire(config =>
{
config.UseFilter(new TypeFilterAttribute(typeof(LogToDbAttribute)));
// if you are using the sqlserverstorage, uncomment the line and provie
// the required prameters
// config.UseSqlServerStorage(connectionString, sqlServerStorageOptions);
});
ОБНОВЛЕННЫЙ ОТВЕТ
Пожалуйста, ознакомьтесь с изменениями, которые я внес в предоставленный вами код. Я протестировал его, и он работает. Несколько моментов, на которые следует обратить внимание ниже.
Посмотрите, как я зарегистрировал HttpClient, используя метод AddHttpClient, который использует HttpClientFactory и Typed Clients. Это рекомендуемый способ использования HttpClient. Подробнее об этом можно прочитать здесь а>
services.AddHttpClient<HfHttpClient>(client =>
{
client.BaseAddress = new Uri("http://localhost:44303");
// you can set other options for HttpClient as well, such as
//client.DefaultRequestHeaders;
//client.Timeout
//...
});
Кроме того, вам потребуется зарегистрировать LogDbAttribute
, а затем разрешить его в вызове UseFilter, используя IServiceProvider
// register the LogToDbAttribute
services.AddSingleton<LogToDbAttribute>();
// build the service provider to inject the dependencies in LogDbAttribute
var serviceProvider = services.BuildServiceProvider();
services.AddHangfire(config => config
.UseSqlServerStorage(Configuration.GetConnectionString("HangfireDBConnection"))
.UseFilter(serviceProvider.GetRequiredService<LogToDbAttribute>()));
Я также внедрил ILogger, чтобы продемонстрировать, что он работает. По какой-то причине, если вы попытаетесь что-то сделать с HttpClient, он зависнет. Возможно, причина в том, что это фоновая работа, и все вызовы HttpClient асинхронны, поэтому он не возвращается, и два процесса пытаются дождаться друг друга.
Если вы планируете внедрить HttpClient, возможно, вам придется изучить его. Тем не менее, регистратор работает нормально.
Кроме того, вам не нужно наследовать LogDbAttribute от TypeFilterAttribute. Решение TypeFilterAttribute не работает, как я первоначально предполагал.
person
Shahzad Hassan
schedule
26.04.2019