私の解決策は、サービスがメール メッセージを取得するために使用できるインターフェイスをサービス層に構築することでしたが、メッセージを作成する実装は引き続き 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 への参照を取得したら、Send() を呼び出すだけでなく、SMTP コードに送信できます。あなたの目的のために、MvcMailMessage クラスの他の部分にアクセスするために、IMailMessage インターフェイスをさらに肉付けする必要があるかもしれません。