情境

大约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中的代码的情况下完成此操作?

最佳答案

您正在努力实现应该是一个简单要求的事实,这很明显地说明您已经积累了太多的technical debt。您的帖子表达了强烈不愿偿还技术债务的强烈意愿。您必须避免这种情况,而应使用Merciless Refactoring。咬紧牙关,介绍专门的SMTP类。

10-07 19:24
查看更多