Я правильно настроил 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();
}
Я получаю сообщение об ошибке:
Произошло необработанное исключение при выполнении запроса. System.InvalidOperationException: невозможно разрешить службу для типа Restore.API.Controllers.MailsController при попытке активировать Restore.API.Controllers.SchedulersController
Как я могу использовать свой MailsController
, чтобы запланировать отправку писем с помощью Hangfire? Любая помощь будет оценена.
2 ответа
Правильный способ сделать это - переместить логику отправки почты в отдельный сервис.
// 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.
Это связано с внедрением зависимостей в Core Framework. Вам необходимо убедиться, что вы зарегистрировали свои зависимости в файле startup.cs с помощью метода ConfigureService
.
Не уверен, что это хорошая практика.
Для контроллера вы можете использовать: services.AddMvc (). AddControllersAsServices ();
Похожие вопросы
Связанные вопросы
Новые вопросы
c#
C # (произносится как «резкий») - это высокоуровневый, статически типизированный язык программирования с несколькими парадигмами, разработанный Microsoft. Код C # обычно нацелен на семейство инструментов и сред выполнения Microsoft .NET, включая, среди прочего, .NET Framework, .NET Core и Xamarin. Используйте этот тег для вопросов о коде, написанном на C # или в формальной спецификации C #.