Как использовать MVCMailer, не нарушая мой уровень обслуживания?

Я изучаю использование MVcMailer для создания приятных писем.

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

Мой второй проект не знает MVC, и я хотел бы сохранить его таким.

Я думаю, что мой smtp-код перейдет в сервисный слой или оболочку, а затем я вызову его из других сервисных уровней, когда мне нужно будет отправлять электронные письма.

Так куда же подходит почтовая программа MVC? Я генерирую тело в контроллере, а затем передаю его слою serivce, который передает его моему классу smtp?

2 ответа

Решение

MVCMailer, похоже, уже поддерживает отправку электронной почты. Если вы правильно настроите конфигурацию, она сможет отправлять электронные письма заполненным MailerViews без дополнительной реализации.

Я не уверен в роли вашего второго проекта в вашем решении, но здесь есть две возможности:

  1. Вероятно, не практично... Дождитесь версии с "Отправка электронной почты из фонового процесса"

  2. Забудьте о Smtp из вашего второго проекта и, используя Http, просто вызовите View, который в свою очередь вызовет MVCMailer

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

Интерфейсы находятся на уровне сервиса:

public interface IMailMessage
{
    void Send();
    void SendAsync();
}

public interface IUserMailer
{
    IMailMessage Welcome(WelcomeMailModel model);
}

Затем реализации находятся в веб-проекте (MVC):

public class MailMessage : MvcMailMessage, IMailMessage
{

}

public class UserMailer : MailerBase, IUserMailer
{
    public UserMailer()
    {
        MasterName = "_Layout";
    }

    public IMailMessage Welcome(WelcomeMailModel model)
    {
        var mailMessage = new MailMessage();
        mailMessage.SetRecipients(model.To);
        mailMessage.Subject = "Welcome";

        ViewData = new System.Web.Mvc.ViewDataDictionary(model);
        PopulateBody(mailMessage, "Welcome");

        return mailMessage;
    }
}

Наконец, на уровне сервиса интерфейс почтовой программы является зависимостью сервиса:

public class UserCreationService : IUserCreationService
{
    private readonly IUserRepository _repository;
    private readonly IUserMailer _userMailer;

    public UserCreationService(IUserRepository repository, IUserMailer userMailer)
    {
        _repository = repository;
        _userMailer = userMailer;
    }

    public void CreateNewUser(string name, string email, string password)
    {
        // Create the user's account
        _repository.Add(new User { Name = name, Email = email, Password = password });
        _repository.SaveChanges();

        // Now send a welcome email to the user
        _userMailer.Welcome(new WelcomeMailModel { Name = name, To = email }).Send();
    }
}

Когда он подключен к внедрению зависимостей, объект Web.UserMailer используется для параметра Services.IUserMail для создания объекта UserCreationService.

Я постарался сохранить пример простым, чтобы за ним было легко следовать, но как только у вас есть ссылка на IMailMessage на уровне сервиса, вы можете отправить его на свой SMTP-код вместо простого вызова Send(), как я. В ваших целях вам, возможно, потребуется более детализировать интерфейс IMailMessage, чтобы получить доступ к другим частям класса MvcMailMessage.

Другие вопросы по тегам