如何在不破坏我的服务层的情况下使用MVCMailer?
我正在研究使用MVcMailer制作更好的电子邮件。
但是我不确定的一件事是如何组织代码。 我目前有2个项目。 一个用于mvc,一个用于我的repos和服务层。
我的第二个项目不了解MVC,我想保持这种方式。
我在想我的smtp代码会进入服务层或包装器,然后当我需要发送电子邮件时,我会从其他服务层调用它。
那么MVC邮件适合哪里? 我是否在控制器中生成主体然后将其传递给将其传递给我的smtp类的服务层?
MVCMailer似乎已经支持发送电子邮件。 如果您正确设置了配置,它应该能够通过电子邮件发送填充的MailerViews而无需额外的实现。
我不确定您的第二个项目在您的解决方案中的作用,但这里有两种可能性:
-
可能不实用……等待“从后台进程发送电子邮件”的版本
-
忘掉你的第二个项目中的Smtp并使用Http只需调用一个View,然后调用MVCMailer
我的解决方案是在服务层中构建接口,然后我的服务可以使用它来获取邮件消息,而创建消息的实现继续驻留在Web层中。
接口位于服务层中:
public interface IMailMessage { void Send(); void SendAsync(); } public interface IUserMailer { IMailMessage Welcome(WelcomeMailModel model); }
然后在Web(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(); } }
当它在dependency injection中连接时,Web.UserMailer对象用于Services.IUserMail参数来构造UserCreationService对象。
我试图保持示例简单,以便易于遵循,但是一旦在服务层中引用了IMailMessage,就可以将其发送到SMTP代码而不是像我一样调用Send()。 出于您的目的,您可能需要更多地充实IMailMessage接口,以便访问MvcMailMessage类的其他部分。