.NET MVC 项目中静态类和单例有什么区别?

var*_*ble 6 .net c# asp.net-web-api .net-6.0

我理解静态类和单例之间的区别,重要的是单例可以实例化一次,而静态类不需要实例。

这个问题是从 .NET MVC 项目的角度来看的,以帮助我在使用它们中的任何一个之间做出决定。

因此,假设我有一个类,其方法如下所示:

  1. 我有一个类似的方法 ConvertMeterToMiles(int mtr),其中没有注入依赖项。

  2. 或者像这样的方法SendEmail(str eaddress),其中没有注入依赖项,但它会实例化,new SMTPClient...然后在finally中处理 SMTPClient

假设我想将该方法放入实用服务类中,那么我应该创建一个静态类还是单例(带有依赖注入的源代码)?

我知道没有范围或瞬态的意义,因为拥有新实例没有任何好处。

Gur*_*ron 4

我想说,在您的应用程序上下文中,差异归结为是否使用 DI 以及谁控制生命周期/实例化/注入。

如果某些功能不应该根据环境或其他一些可变性来源而有所不同,那么将某些功能转移到某些静态帮助器类中可能会很好(另一件事要考虑 - 如果该方法是纯的或不是纯的,即纯函数通常也可以是很好的候选者) 。例如,ConvertMeterToMiles似乎是这种处理的一个很好的候选者。

SendEmail另一方面似乎不是一个 - 在某些环境中您可能不想发送电子邮件(例如测试),或者将来您预计此功能有多个实现(或需要重新实现)(例如例如,对于某些上下文,可以使用队列推迟电子邮件发送,例如,该队列将由某些后台工作人员或其他服务处理)。在这种情况下,您可以高度利用 DI 的存在,封装此功能并将其隐藏在合约后面(我还想说,SMTPClient当设置在 DI 中注册并解析为封装实现时,处理设置会更干净)。