3

设想

大约 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 中的情况下做到这一点?

4

2 回答 2

2

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

我假设您将有关用户的所有信息集中存储在某个地方,以及他们不想再收到任何电子邮件的信息。因此,在我看来,只要您询问要向其发送电子邮件的用户列表,就可以简单地不再返回这些用户。

我对您当前应用程序的工作方式知之甚少,但这似乎是更改它的最方便的地方。

于 2012-09-10T12:23:45.103 回答
0

您正在努力实现应该是一个简单的要求这一事实是您积累了太多技术债务的重要线索。您的帖子表达了对偿还技术债务的强烈意愿。这是您必须避免的事情,而是接受无情重构。咬紧牙关,介绍专门的 SMTP 类。

于 2012-09-17T11:57:17.817 回答