【发布时间】:2023-03-21 05:47:01
【问题描述】:
场景
大约 20 个 ASP.net(VB) 应用程序共享相同的代码框架,并且在部署时也共享一个通用的 web.config。在各种应用程序中,我们使用 System.Net.Mail.SmtpClient/MailMessage 来发送电子邮件,现在我们希望为我们的用户实现电子邮件退出功能,同时对现有代码进行最少的更改。这遗漏了最简单的方法;从 SmtpClient 继承一个类,比如 OurSmtpClient,并覆盖 Send() 方法以删除所有选择不接收电子邮件的用户,因为这意味着我们必须将所有 New SmtpClient() 更改为 New OurSmtpClient()应用程序。
替代品
我们之前使用 tagMapping 将标签重新映射到我们内部的派生替代品,类是否有类似的东西,以便所有 SmtpClient 自动成为 OurSmtpClient 并因此将使用覆盖的 Send() 方法?
我们也看过Extensions,但这里的问题是我们不能覆盖现有的方法,只能添加新的?
我们考虑过的下一个替代方案是反射,但我们无法考虑如何实际实施它。
Events .. 哦,如果有 Sending 事件...
代码(因为大家都喜欢)
这里是继承方法,只是为了理解我们在寻找什么:
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 中的情况下做到这一点?
【问题讨论】:
-
您的优先事项是什么,以最少的工作量完成这项工作,还是以灵活的方式完成这项工作,以便将来进一步改变?
-
一个很好且有效的问题,Wiktor。当然,子类化 SmtpClient 让我们在未来添加额外功能方面处于更好的状态。但这也意味着现在可能不需要做很多工作。我们在这里谈论的是遍布许多应用程序的相当多行代码,虽然这是在 VS 和 Ctrl+H 中打开项目的问题,但这也意味着我们必须遵循我们所有的 Q/A、测试和部署例程这些应用程序。因此,我们希望减少执行此操作的工作量,这意味着只需更改共享框架和 web.config。
-
您是否考虑过使用进行统计编织的 AOP 框架(如 PostSharp)?这将需要一些研究,但您现有的调用可能会被框架拦截,然后您可以创建一个特定的建议来处理您的自定义逻辑。不幸的是,我手头没有工作示例。
-
谢谢你的建议,维克托。我偶然发现了那个替代方案,但没有仔细研究它,因为它需要添加一个额外的库。与 .NET 一样多才多艺,我希望有一个解决这个问题的方法,但似乎我们在这个问题上并不走运。
-
如果我错了,请纠正我,但是 SmtpClient.Send 不是虚拟的,你打算如何覆盖它?