Как правильно внедрить контекст БД в задание Hangfire Recurring? - PullRequest
0 голосов
/ 28 ноября 2018

Я использую HangFire для регулярной отправки электронных писем пользователям в фоновом режиме.

Я получаю адреса электронной почты из базы данных, но я не уверен, что я "внедряю" контекст базы данных вСлужба, которая отвечает за отправку электронной почты правильно

Это работает правильно, есть ли лучший способ сделать это?

public void Configure(IApplicationBuilder app, IHostingEnvironment env, Context context)
{
    (...)

    app.UseHangfireDashboard();
    app.UseHangfireServer(new BackgroundJobServerOptions
    {
        HeartbeatInterval = new System.TimeSpan(0, 0, 5),
        ServerCheckInterval = new System.TimeSpan(0, 0, 5),
        SchedulePollingInterval = new System.TimeSpan(0, 0, 5)
    });

    RecurringJob.AddOrUpdate(() => new MessageService(context).Send(), Cron.Daily);

    (...)
    app.UseMvc();
}

public class MessageService
{
    private Context ctx;

    public MessageService(Context c)
    {
        ctx = c;
    }

    public void Send()
    {
        var emails = ctx.Users.Select(x => x.Email).ToList();

        foreach (var email in emails)
        {
            sendEmail(email, "sample body");
        }
    }
}

Ответы [ 2 ]

0 голосов
/ 02 декабря 2018

Определенно нужно использовать DI (StructureMap или т. Д.) Для вашей проблемы.Пожалуйста, измените конфигурационный файл и отделите зависимость класса «Context» от класса config.Также введите контейнерный класс для отображения классов DI (автоматический или ручной).

Создать класс контейнера

Добавить контейнер в Hangfire:

GlobalConfiguration.Configuration.UseStructureMapActivator(Bootstrapper.Bootstrap());

Также изменить регистрацию задания в классе конфигурации:

RecurringJob.AddOrUpdate<MessageService>(x => x.Send(), Cron.Daily);
0 голосов
/ 28 ноября 2018

Зарегистрировать репозиторий через точку расширения DI HF следующим образом http://docs.hangfire.io/en/latest/background-methods/using-ioc-containers.html

...