【问题标题】:Lifetime of static variables in .NET.NET 中静态变量的生命周期
【发布时间】:2011-04-18 09:28:29
【问题描述】:

我有一个使用一些配置设置的扩展方法。我已将这些声明为static。

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

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

我只是想检查一下这是否符合我的意图,因为我不能 100% 确定。我的想法是我不想继续阅读这些值,我希望它们被读取一次并在 Web 应用程序的生命周期内缓存。这是会发生什么吗?谢谢

【问题讨论】:

  • 我不会从扩展方法中的配置中读取。您的扩展方法应该适用于所有 IOrder,但您仅适用于配置正确的应用中的 IOrder。
  • 嗯,我想不出还有什么办法。通知服务实际上并不是域模型的一部分,即发送电子邮件不应该是 IOrder 的责任(它基本上只保存订单数据)。因此,当我想发送订单状态更改通知时,我编写了从控制器调用的扩展。你觉得这样的有道理吗?还是有更好的办法?
  • 发送电子邮件通常是企业中的一个横切关注点。我会创建一个服务,其唯一目的是发送电子邮件。您可以为您发送的特定电子邮件设置特定方法,但我肯定会隔离您应用程序的电子邮件发送部分。

标签: c# .net static


【解决方案1】:

(更新了 KeithS 的说明,即直到第一次使用它们才会被阅读)

它们将在第一次使用时被读取,然后一直保留到 AppDomain 停止或回收,这可能是您想要的。

也就是说,ASP.NET 应用程序在 AppDomain 中运行。这就是它们如何驻留并可供多个请求使用,而无需为每个单独的请求启动。您可以配置它们的生存时间和回收时间等。静态变量与应用程序一起生存和死亡,因此只要应用程序驻留在应用程序域中,它们就会继续存在。

【讨论】:

  • 是的,直到有十几个人进来澄清这不是 100% 正确的所有边缘情况...... ;)
  • 基本上就是这个。更具体地说,静力学在第一次需要时会被懒惰地评估。这节省了预先初始化一堆静态的启动成本。因此,第一次运行 SendEmailConfirmation() 时,它将访问应用程序设置,并将在应用程序域的整个生命周期内保持它(将运行直到应用程序池或 IIS 重置;第一次会不时自动发生,另一个由用户选择或在服务器重新启动时发生)
  • @user279521 我认为 IIS 中的默认配置将在用户访问该站点时启动应用程序域。然后,如果在一段时间内(15 分钟?)没有任何反应,它将停止应用程序域。我经常更改这些限制,以便不经常使用的应用程序保持更长时间,以避免对那个可怜的第一个用户造成巨大的延迟
  • 那是与会话对象同步的吗?
【解决方案2】:

_mailServer 将在第一次使用 Extensions 类时被初始化(以任何方式)。在重新加载应用程序域之前不会再次设置它。

【讨论】:

    【解决方案3】:

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

    【讨论】:

      猜你喜欢
      • 2011-09-12
      • 1970-01-01
      • 2013-07-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-09-03
      • 2011-07-15
      • 1970-01-01
      相关资源
      最近更新 更多