3

考虑一个动态调整大型 tiff 文件大小的 Web 应用程序。当用户调用操作时,每个大的 tiff 文件都会被调整为 jpg 缩略图和更大的 jpg。这些转换后的文件的尺寸始终相同。

在昨天的代码审查中,其他一位开发人员问我为什么要在 global.asax 中设置这些维度,如下所示:

    Application["resizedImageWidth"] = int.Parse(ConfigurationManager.AppSettings["ResizedImageWidth"]);

,而不仅仅是在实际方法调用期间通过配置文件查找值。如果最终用户在测试应用程序后想要更改尺寸,我将宽度存储在配置文件中,这样我就不必更改内联代码。

我给出的理由是防止每次生成图像时从配置文件中读取,但无法回答在查找应用程序级别变量期间是否存在类似的开销。这种优化可能不会大规模影响性能,但我想知道社区认为更有效的解决方案是什么,即在应用程序启动期间设置它们,或者在方法调用期间动态读取它们。

4

3 回答 3

2

通常,您应该根据需要即时读取配置。该框架将缓存配置文件,因此它的性能相当不错。而且我相信(不要引用我的话)ASP.Net 可以监视并将更改引入配置文件,而无需重新启动应用程序。

我通常喜欢创建一个配置类,它将隐藏值存储位置的详细信息:

public static class Config
{

   public static int GetXDimension()
   {
      ...
   }

}

这使您的调用代码与配置代码保持干净,如果您发现我错了,您不必到处更改代码。

于 2009-04-28T14:31:33.757 回答
1

将此值存储在 Application 对象中是正确的。事实上,这就是提供Application背后的明确目的:保存在应用程序的所有页面和用户中都可用的值。

由于应用程序设置保存在内存中,它确实会更高效。很明显,从内存读取比从配置文件读取要快得多(更不用说通过 ConfigurationManager.AppSettings 类方法和整数解析进行查找)。

对 web.config 文件的任何更改都会导致应用程序重新启动。事实上,这就是我在测试期间重新启动应用程序(在需要时)的方式。如果您需要“即时”更改此值,您甚至可能希望将此值存储在数据库的“配置”表中,而不是将其保存在 Web.config 文件中,以便更改它不会重新启动应用程序。

我使用的一个技巧类似于 Josh 的 Config 类:我有一个“BusinessLogic”类,我在该类的静态变量中放置了少量设置,以便我可以以类型安全的方式访问它们。这并不难,而且在可读性方面的回报非常明显。

于 2009-10-06T20:15:55.853 回答
1

我建议扩展 Josh 的答案并按需调用它,然后将其缓存到私有变量中:

public static class Config
{
   private static int? xDimension;
   public static int GetXDimension()
   {
      if(xDimension == null)
          xDimension = int.Parse(ConfigurationManager.AppSettings["ResizedImageWidth"]);
      return xDimension.Value;
   }
}

或进入应用程序:

public static class Config
{
   public static int GetXDimension()
   {
      if(Application["xDimension"] == null)
          Application["xDimension"] = int.Parse(ConfigurationManager.AppSettings["ResizedImageWidth"]);
      return (int)Application["xDimension"];
   }
}
于 2009-10-06T20:21:25.263 回答