Распоряжаться производным классом - PullRequest
2 голосов
/ 11 октября 2019

У меня есть класс, производный от System.Net.Mail.MailMessage. Класс будет содержать только некоторый статический текст в формате HTML для тела письма.

public sealed class CustomMessage : MailMessage
{
    public void SendTo(params string[] addresses)
    {
        foreach (var address in addresses)
        {
            SendTo(address);
        }
    }

    public void SendTo(string address)
    {
        To.Add(address);
    }

    // ...
}

Затем я могу обернуть его в оператор using:

using (var message = new CustomMessage())
{
     message.SendTo("address1", "address2");
     //...
}

База MailMessageкласс реализует IDisposable:

protected virtual void Dispose(bool disposing)
{
  if (!disposing || this.disposed)
    return;
  this.disposed = true;
  if (this.views != null)
    this.views.Dispose();
  if (this.attachments != null)
    this.attachments.Dispose();
  if (this.bodyView == null)
    return;
  this.bodyView.Dispose();
}

Нужно ли по-прежнему переопределять метод Dispose(bool), хотя в моем классе нет ничего особенного?

bool disposed = false;

protected override void Dispose(bool disposing)
{
    if (disposed)
     return; 

     if (disposing) 
     {
        // Nothing managed to dispose.
     }

     // Nothing unmanaged to dispose.

     disposed = true;
     base.Dispose(disposing);
}

Ответы [ 2 ]

4 голосов
/ 11 октября 2019

Нет, CustomMessage наследует базовые Dispose() и Dispose(bool) методы. Ему не нужно переопределять их, если только он не должен выполнять некоторые дополнительные действия самостоятельно.

Я только что заметил, что вы используете System.Net.Mail.MailMessage. Не. Он устарел, и сама Microsoft настоятельно рекомендует не использовать его.

Альтернатива пользовательскому сообщению

В любом случае лучше написать метод расширения для добавления нескольких получателей, чемсоздание нового класса сообщений. Вы можете создать что-то подобное в MimeKit, предлагаемой замене для SmtpClient:

static public void AddRecipients(this MimeMessage message,IEnumerable<string> addresses)
{
    var ads=addresses.Select(ad=>MailboxAddress.Parse(ad));
    message.To.AddRange(ads);
}

Или это для SmptClient

static public void AddRecipients(this MailMessage message,IEnumerable<string> addresses)
{
    foreach (var address in addresses)
    {
        message.To.Add(address);
    }
}

SmptClient устарел

Я только что заметил, что вы используете System.Net.Mail.MailMessage. Не. Сама Microsoft предостерегает от использования SmptClient в очень сильно отформатированном предупреждении, в самом верху страницы документа SmptClient:

Warning

Этот API теперь устарел.

На самом деле вы уже должны получать предупреждение компилятора:

SmtpClient и его сеть типов плохо спроектированы, мы настоятельно рекомендуем вамиспользуйте https://github.com/jstedfast/MailKit и https://github.com/jstedfast/MimeKit вместо

Вы должны изменить свой код, чтобы использовать MailKit. Вам, возможно, не придется создавать собственное сообщение.

API похож на SmptClient для простых случаев, и есть даже операция приведения из System.Net.Mail.MailMessage к собственному MimeKit MimeMessage, чтобы упростить переход.

Пример с целевой страницы Gitub MailKit показывает, насколько просто им пользоваться

var message = new MimeMessage ();
message.From.Add (new MailboxAddress ("Joey Tribbiani", "joey@friends.com"));
message.To.Add (new MailboxAddress ("Mrs. Chanandler Bong", "chandler@friends.com"));
message.Subject = "How you doin'?";

message.Body = new TextPart ("plain") {
    Text = @"Hey Chandler,

I just wanted to let you know that Monica and I were going to go play some paintball, you in?

-- Joey"
};

using (var client = new SmtpClient ()) {
    // For demo-purposes, accept all SSL certificates (in case the server supports STARTTLS)
    client.ServerCertificateValidationCallback = (s,c,h,e) => true;

    client.Connect ("smtp.friends.com", 587, false);

    // Note: only needed if the SMTP server requires authentication
    client.Authenticate ("joey", "password");

    client.Send (message);
    client.Disconnect (true);
}
3 голосов
/ 11 октября 2019

Поскольку у вас нет ничего лишнего для удаления, вам не нужно переопределять удаление.

...