Как использовать MVCMailer, не нарушая мой уровень обслуживания?
Я изучаю использование MVcMailer для создания приятных писем.
Однако в одном я не уверен, как организовать код. У меня сейчас 2 проекта. Один для MVC и один для моих репозиториев и сервисных слоев.
Мой второй проект не знает MVC, и я хотел бы сохранить его таким.
Я думаю, что мой smtp-код перейдет в сервисный слой или оболочку, а затем я вызову его из других сервисных уровней, когда мне нужно будет отправлять электронные письма.
Так куда же подходит почтовая программа MVC? Я генерирую тело в контроллере, а затем передаю его слою serivce, который передает его моему классу smtp?
2 ответа
MVCMailer, похоже, уже поддерживает отправку электронной почты. Если вы правильно настроите конфигурацию, она сможет отправлять электронные письма заполненным MailerViews без дополнительной реализации.
Я не уверен в роли вашего второго проекта в вашем решении, но здесь есть две возможности:
Вероятно, не практично... Дождитесь версии с "Отправка электронной почты из фонового процесса"
Забудьте о 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.