.NET中静态变量的生命周期

10

我有一个扩展方法,它使用一些配置设置。我将它们声明为 static

public static class Extensions
{
    static string _mailServer = ConfigurationManager.AppSettings["MailServer"];
    // ... etc    

    public static void SendEmailConfirmation(this IOrder order) { }
}

我只是想确认这样做是否符合我的意图,因为我不是100%确定。我的想法是,我不想一直阅读这些值,我希望它们被读取一次并缓存到Web应用程序的生命周期中。这是否会发生?谢谢


1
我不会在扩展方法中从配置文件中读取内容。你的扩展方法应该适用于所有IOrders,但是你的方法只适用于在正确配置的应用程序中的IOrders。 - Esteban Araya
嗯,我想不出其他的做法了。通知服务并不是领域模型的一部分,也就是说,发送电子邮件不应该是 IOrder 的职责(它基本上只是保存订单数据)。因此,我编写了一些扩展,当我希望发送有关订单状态变更的通知时,从我的控制器中调用这些扩展。你觉得这样做有意义吗?或者还有更好的方法吗? - fearofawhackplanet
发送电子邮件通常是企业中的横切关注点。我会创建一个专门用于发送电子邮件的服务。您可以为发送的特定电子邮件拥有特定的方法,但我肯定会将应用程序的电子邮件发送部分隔离开来。 - Esteban Araya
3个回答

16

(在KeithS澄清后更新)它们只有在第一次使用时才会被读取,然后保留到AppDomain停止或回收为止,这可能是你想要的。

也就是说,ASP.NET应用程序运行在一个AppDomain中。这就是它们如何在不必为每个单独请求启动的情况下驻留并可供多个请求使用。您可以配置它们的生存时间和重启时间等。静态变量和应用程序一起存在,因此只要应用程序在应用程序域中存在,它们就会存在。


3
是的,直到有十几个人进来澄清所有边缘情况,说明这并不完全正确... ;) - Michael Haren
3
基本上是这样的。更具体地说,静态变量在首次需要时才进行惰性求值。这可以节省初始化大量静态变量的启动成本。因此,第一次运行SendEmailConfirmation()时,它将访问应用程序设置,并将其保留到应用程序域的生命周期结束(直到应用程序池或IIS重置;前者会定期自动发生,后者会在用户选择或服务器重新启动时发生)。 - KeithS
@user279521 我认为IIS中的默认配置会在用户访问站点时启动应用程序域。然后,如果一段时间内没有任何请求(15分钟?),它将停止应用程序域。我经常更改这些限制,以便不太频繁使用的应用程序可以保持更长时间的运行,避免第一个用户遭受巨大的延迟。 - Michael Haren
那么它是否与会话对象同步? - user279521

1

_mailServer 会在 Extensions 类第一次被使用时进行初始化(无论以何种方式)。它不会再次设置,直到应用程序域重新加载。


1

它们将在第一次需要时加载,并且会一直保留在内存中,直到IIS回收应用程序。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接