3

大きなtiffファイルのサイズをその場で変更するWebアプリケーションについて考えてみます。ユーザーが操作を呼び出すと、大きなtiffファイルはそれぞれjpgサムネイルと大きなjpgにサイズ変更されます。これらの変換されたファイルのサイズは常に同じです。

昨日のコードレビュー中に、他の開発者の1人が、なぜこれらのディメンションを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オブジェクトに格納するのは正しいことです。実際、それがアプリケーションの提供の背後にある明確な目的です。つまり、アプリケーションのすべてのページとユーザーで利用できる値を保持することです。

アプリケーション設定がメモリに保持されるため、実際にパフォーマンスが向上します。メモリからの読み取りは、構成ファイルからの読み取りよりも大幅に高速であることは明らかです(ConfigurationManager.AppSettingsクラスメソッドと整数解析によるルックアップは言うまでもありません)。

web.configファイルに変更を加えると、実際にアプリケーションが再起動します。実際、これは、テスト中に(必要に応じて)アプリケーションを再起動する方法です。この値を「オンザフライ」で変更する必要がある場合は、変更してもアプリが再起動しないように、この値をWeb.configファイルに保持するのではなく、データベースの「構成」テーブルに保存することもできます。

私が使用したトリックの1つは、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 に答える