扩展/覆盖System.Net.Mail.SmtpClient发送(消息为MailMessage)方法

时间:2012-07-04 18:01:07

标签: asp.net .net vb.net

方案

大约20个ASP.net(VB)应用程序共享相同的代码框架,并且在部署时也共享一个共同的web.config。在各种应用程序中,我们使用System.Net.Mail.SmtpClient / MailMessage发送电子邮件,现在我们希望为用户实现电子邮件选择退出功能,只需对现有代码进行少量更改。这省略了最简单的方法;从SmtpClient继承一个类,比如说OurSmtpClient,并覆盖Send()方法以删除所有选择不接收电子邮件的用户,因为这意味着我们必须将所有New SmtpClient()更改为New OurSmtpClient()应用程序。

替代

我们以前使用tagMapping将标记重新映射到我们的内部派生替代品,类是否有类似的东西,以便所有SmtpClient自动成为OurSmtpClient,因此将使用重写的Send()方法?

我们也看了Extensions,但问题是我们不能覆盖现有方法,只添加新方法?

我们考虑的下一个替代方案是反思,但我们无法理解如何实际实现它。

活动..哦,如果有发送活动......

代码(因为每个人都喜欢它)

这是继承方法,只是为了理解我们正在寻找的东西:

Public Class OurSmtpClient
    Inherits SmtpClient

    Public Overloads Sub Send(message As MailMessage)
        For i As Integer = message.To.Count - 1 To 0 Step -1
            With message.To(i)
                If (.Address.Contains("test")) Then
                    message.To.RemoveAt(i)
                End If
            End With
        Next

        MyBase.Send(message)
    End Sub
End Class

有什么建议吗?如何在不更改现有应用程序中的代码且仅在共享代码(存在于应用程序中的App_Code中)或共享web.config中的情况下完成此操作?

2 个答案:

答案 0 :(得分:2)

我会在数据层而不是在邮件客户端中更改此内容。

我假设您集中存储了有关您用户的所有信息,以及他们不愿接收任何其他电子邮件的信息。因此,在我看来,只要您要求用户列表发送电子邮件,就很有可能不再返回这些用户。

我对当前应用程序的工作方式不太了解,但这似乎是最方便的更改方式。

答案 1 :(得分:0)

你正在努力实现应该是一个简单的要求这一事实是一个很大的线索,你已经建立了太多technical debt。你的帖子强烈不愿意支付技术债务。这是你必须避免的事情,而是拥抱Merciless Refactoring。咬紧牙关并介绍专门的SMTP类。