9

より良いメールを作成するためにMVcMailerを使用することを検討しています。

しかし、私が確信していないことの 1 つは、コードを整理する方法です。私は現在2つのプロジェクトを持っています。1 つは mvc 用、もう 1 つはリポジトリとサービス レイヤー用です。

私の2番目のプロジェクトにはMVCの知識がなく、そのままにしておきたいです。

私のsmtpコードはサービスレイヤーまたはラッパーに入り、メールを送信する必要があるときに他のサービスレイヤーから呼び出すことを考えています。

では、MVC メーラーはどこに収まるのでしょうか? コントローラーで本文を生成してから、それを smtp クラスに渡すサービス層に渡しますか?

4

2 に答える 2

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 への参照を取得したら、Send() を呼び出すだけでなく、SMTP コードに送信できます。あなたの目的のために、MvcMailMessage クラスの他の部分にアクセスするために、IMailMessage インターフェイスをさらに肉付けする必要があるかもしれません。

于 2013-12-09T18:41:08.807 に答える
0

MVCMailer は、既に電子メールの送信をサポートしているようです。構成を正しく設定すると、追加の実装なしで、入力された MailerViews を電子メールで送信できるはずです。

ソリューションにおける2番目のプロジェクトの役割はわかりませんが、2つの可能性があります:

  1. おそらく実用的ではありません...「バックグラウンドプロセスからのメール送信」のあるバージョンを待ちます

  2. 2 番目のプロジェクトの Smtp を忘れて、Http を使用して View を呼び出すだけで、MVCMailer が呼び出されます。

于 2011-03-28T02:23:50.310 に答える