Как настроить почтовый сервис или сервис уведомлений для asp.net mvc - PullRequest
2 голосов
/ 14 января 2011

Как создать класс обслуживания уведомлений об отправке электронной почты, который можно смоделировать и выполнить модульный тест?

Мой сервис находится в другом слое, который является библиотекой классов. Я пытаюсь не импортировать SMTP-клиент, но если это неизбежно, то это не проблема. Вот что у меня сейчас:

public class EmailNotificationService : INotificationService
{
    private readonly EmailNotification _emailNotification;

    public EmailNotificationService(EmailNotification emailNotification)
    {
        _emailNotification = emailNotification;
    }

    public void Notify()
    {
        using (var mail = new MailMessage())
        {
            //If no replyto was passed in the notification, then make it null.
            mail.ReplyTo = string.IsNullOrEmpty(_emailNotification.ReplyTo) ? null : new MailAddress(_emailNotification.ReplyTo);

            mail.To.Add(_emailNotification.To);
            mail.From = _emailNotification.From;
            mail.Subject = _emailNotification.Subject;
            mail.Body = _emailNotification.Body;
            mail.IsBodyHtml = true;

            //this doesn't seem right.
            SmtpClient client = new SmtpClient();
            client.Send(mail);
        }
    }
}

public class EmailNotification
{
    public EmailNotification()
    {
        To = "";
        ReplyTo = "";
        Subject = "";
        Body = "";
    }
    public string To { get; set; }
    public string ReplyTo { get; set; }
    public string Subject { get; set; }
    public string Body { get; set; }

}

1 Ответ

1 голос
/ 14 января 2011

Если вы не хотите импортировать библиотеку System.Net.Mail, вам придется использовать интерфейс. Обратите внимание, что это не очень помогает для вашего юнит-тестирования, хотя

public interface IEmailSender{
     void Send(EmailNotification emailNotification);
}

и затем в своем классе EmailNotificationService вы можете добавить следующее свойство или передать IEmailSender в своем конструкторе

private IEmailSender emailSender;

public IEmailSender EmailSender
{
     get{
          if(this.emailSender == null){
               //Initialize new EmailSender using either
               // a factory pattern or inject using IOC 
          }
          return this.emailSender
     }
     set{
          this.emailSender = value;
     }
}

Ваш метод уведомления станет

public void Notify()
{
    EmailSender.Send(_emailNotification);
}

затем вы создадите конкретный класс, который реализует интерфейс IEmailSender

public class MyEmailSender: IEmailSender
{
     public void Send(EmailNotification emailNotification)
     {
        using (var mail = new MailMessage())
        {
            //If no replyto was passed in the notification, then make it null.
            mail.ReplyTo = 
                    string.IsNullOrEmpty(_emailNotification.ReplyTo) ? null : 
                    new MailAddress(_emailNotification.ReplyTo);

            mail.To.Add(emailNotification.To);
            mail.From = emailNotification.From;
            mail.Subject = emailNotification.Subject;
            mail.Body = emailNotification.Body;
            mail.IsBodyHtml = true;

            SmtpClient client = new SmtpClient();
            client.Send(mail);
        }
     }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...