Куда я должен отправить подтверждение по электронной почте? - PullRequest
1 голос
/ 23 июня 2009

Я интегрирую список рассылки в существующую CMS в asp.net MVC.

Мне нужно отправить подтверждение по электронной почте подписчику. Откуда я должен послать это, контроллер, или сервисный уровень?

Пояснение: Я бы определенно создал отдельный метод службы, называемый SendConfirmationEmail (). Вопрос в том, кто называет это контроллером, обрабатывающим регистрационную форму, или службой, которая добавила ожидающий запрос в БД?

Очевидно, что я могу отправить его от обоих, но какой из них является правильным MVC?

Ответы [ 2 ]

3 голосов
/ 23 июня 2009

Я полагаю, что стандартный подход заключается в том, чтобы иметь сервис электронной почты, который внедряется в ваш контроллер, и контроллер только вызывает операцию сервиса, как _emailService.Enqueue (myMessage).

public class MyController
{
    IEmailService _emailService;

    public MyController(IEmailService emailService)
    {
        _emailService = emailService;
    }

    public ActionResult Email()
    {
        var myMessage = new MyMessage();

        // Initialize message here

        _emailService.Enqueue(myMessage);
        return View();
    }
}

Некоторые из преимуществ:

  • повторное использование: если вам нужно использовать функциональность электронной почты в другом контроллер / действие
  • тестируемость: вы можете издеваться над почтовой службой в модульные тесты, поэтому ваши тесты не полагаются на SMTP-сервере
  • вы можете заменить реализацию почтовой рассылки и вместо отправки почты напрямую поставить ее в очередь для асинхронной отправки
0 голосов
/ 23 июня 2009

MVC поощряет разделение интересов , поэтому размещение поведения в слоях связано с решением проблемы поведения. Поскольку я не знаком с вашей архитектурой, я не знаю, что вы подразумеваете под «уровнем обслуживания», но поскольку отправка электронных писем имеет мало общего с моделями, представлениями или контроллерами вашего веб-сайта, я бы посоветовал вам перенести эту функцию в приложение. слой, где он принадлежит.

Если ваш сервисный уровень фактически является прикладным, то я бы поместил код там.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...