考虑一个动态调整大型tiff文件大小的Web应用程序。当用户调用操作时,每个大的tiff文件被调整为jpg缩略图和更大的jpg。这些转换文件的尺寸始终相同。
在昨天的代码审查期间,其他一位开发人员问我为什么要在我的global.asax中设置这些维度,如下所示:
Application["resizedImageWidth"] = int.Parse(ConfigurationManager.AppSettings["ResizedImageWidth"]);
,而不是在实际方法调用期间通过配置文件查找值。我将宽度存储在配置文件中,以防最终用户在测试应用程序后想要更改尺寸,因此我不必更改内联代码。
我给出的推理是每次生成图像时都阻止从配置文件中读取,但如果在查找应用程序级变量期间出现类似的开销则无法回答。这种优化可能不会对大规模的性能产生影响,但我想知道社区认为更有效的解决方案是什么,即在应用程序启动期间设置它们,或者在方法调用期间动态读取它们。
答案 0 :(得分:2)
通常,您应该根据需要随时阅读配置。该框架将缓存配置文件,因此它具有相当高的性能。而且我相信(不要引用我)ASP.Net可以监控并将更改引入配置文件而无需重新启动应用程序。
我通常喜欢创建一个Configuration类,它将隐藏存储值的详细信息:
public static class Config
{
public static int GetXDimension()
{
...
}
}
这样可以使配置代码中的调用代码保持干净,如果您发现我错了,则无需在任何地方更改代码。
答案 1 :(得分:1)
将此值存储在Application对象中是正确的。实际上,这是提供 Application 背后的明确目的:保存可在应用程序的所有页面和用户中使用的值。
由于应用程序设置保存在内存中,因此确实会更高效。很明显,从内存中读取比从配置文件中读取要快得多(更不用说通过ConfigurationManager.AppSettings类方法和整数解析进行查找)。
对web.config文件的任何更改都会导致重新启动应用程序。实际上,这是我在测试期间重新启动应用程序(如果需要)的方式。如果您需要“动态”更改此值,您甚至可能希望将此值存储在数据库的“配置”表中,而不是将其保存在Web.config文件中,以便更改它不会重新启动应用程序。
我使用的一个技巧类似于Josh的Config类:我有一个“BusinessLogic”类,我在这个类的静态变量中放置了一些设置,以便我可以以类型安全的方式访问它们。这并不难,而且在可读性方面,回报非常明显。
答案 2 :(得分: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"];
}
}