Отправка писем с помощью Hangfire на ядре asp.net 2.1 - PullRequest
0 голосов
/ 23 октября 2018

Я правильно настроил Hangfire.Я могу запустить следующий код из почтальона:

 [HttpPost("appointments/new")]
 public async Task<IActionResult> SendMailMinutely()
 {
     RecurringJob.AddOrUpdate(() => Console.WriteLine("Recurring!") Cron.Minutely);
     await Task.CompletedTask;
     return Ok();
 }

Когда я нажимаю эту точку API, это работает нормально.Я хотел бы запустить свой контроллер электронной почты, используя тот же код, что и выше.Мой модифицированный SchedulersController код:

[Route("/api/[controller]")]
public class SchedulersController : Controller
{
    private readonly MailsController mail;
    public SchedulersController(MailsController mail)
    {
        this.mail = mail;
    }

    [HttpPost("appointments/new")]
    public async Task<IActionResult> SendMailMinutely()
    {
        RecurringJob.AddOrUpdate(() => mail.SendMail(), Cron.Minutely);
        await Task.CompletedTask;
        return Ok();
    }
}

И мой MailsController:

[HttpPost("appointments/new")]
public async Task<IActionResult> SendMail()
 {
    var message = new MimeMessage ();
    message.From.Add (new MailboxAddress ("Test", "test@test.com"));
    message.To.Add (new MailboxAddress ("Testing", "test@test123.com"));
    message.Subject = "How you doin'?";

    message.Body = new TextPart ("plain") {
        Text = @"Hey Chandler,
                I just wanted to let you know that Monica and I were going to go play some paintball, you in?
                -- Joey"
    };

     using (var client = new SmtpClient ()) {
     client.ServerCertificateValidationCallback = (s,c,h,e) => true;

    client.Connect ("smtp.test.edu", 25, false);

    await client.SendAsync (message);
            client.Disconnect (true);
        }


        return Ok();
    }

Полученное сообщение об ошибке:

AnПроизошло необработанное исключение при выполнении запроса.System.InvalidOperationException: Невозможно разрешить службу для типа 'Restore.API.Controllers.MailsController' при попытке активировать 'Restore.API.Controllers.SchedulersController'

Как я могу использовать мой MailsController такя могу запланировать отправку писем с помощью Hangfire?Любая помощь будет принята с благодарностью.

Ответы [ 2 ]

0 голосов
/ 23 октября 2018

Правильный способ сделать это - переместить логику отправки почты в отдельный сервис.

// We need an interface so we can test your code from unit tests without actually emailing people
public interface IEmailService
{
    async Task SendMail();
}

public EmailService : IEmailService
{
    public async Task SendMail()
    {
        // Perform the email sending here
    }
}

[Route("/api/[controller]")]
public class SchedulersController : Controller
{
    [HttpPost("appointments/new")]
    public IActionResult SendMailMinutely()
    {
        RecurringJob.AddOrUpdate<IEmailService>(service => service.SendMail(), Cron.Minutely);
        return Ok();
    }
}

Вам необходимо убедиться, что вы настроили Hangfire для IoC , как описано вих документация , чтобы он мог разрешить IEmailService.

0 голосов
/ 23 октября 2018

Это связано с внедрением зависимостей в Core Framework.Вы должны убедиться, что вы регистрируете свои зависимости в файле startup.cs по методу ConfigureService.

Не уверен, что это хорошая практика.

Для контроллера вы можете использовать: services.AddMvc() .AddControllersAsServices ();

...