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