如何在不破坏我的服务层的情况下使用MVCMailer?

我正在研究使用MVcMailer制作更好的电子邮件。

但是我不确定的一件事是如何组织代码。 我目前有2个项目。 一个用于mvc,一个用于我的repos和服务层。

我的第二个项目不了解MVC,我想保持这种方式。

我在想我的smtp代码会进入服务层或包装器,然后当我需要发送电子邮件时,我会从其他服务层调用它。

那么MVC邮件适合哪里? 我是否在控制器中生成主体然后将其传递给将其传递给我的smtp类的服务层?

MVCMailer似乎已经支持发送电子邮件。 如果您正确设置了配置,它应该能够通过电子邮件发送填充的MailerViews而无需额外的实现。

我不确定您的第二个项目在您的解决方案中的作用,但这里有两种可能性:

  1. 可能不实用……等待“从后台进程发送电子邮件”的版本

  2. 忘掉你的第二个项目中的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类的其他部分。