2

最近、IIS の AppDomain Recycling と、それらをプライマリ値 (null、0 など) に設定する静的変数にどのように影響するかについて学びました。

静的コンストラクターで初期化されるいくつかの静的変数を使用し (初回の初期化では、DB から取得される「小数点以下の桁数」、「管理者の電子メール」などの構成値)、それらの値のみを読み取ります。ウェブサイトの実行。

この問題を解決する最良の方法は何ですか? いくつかの考えられるアイデア:

  • 取得のたびに変数が null/0 かどうかを確認する (パフォーマンスへの影響の可能性 + このチェックを各変数に追加するのにかかる時間 + プロジェクトにコードのオーバーロードが追加されるため、好ましくない)

  • どうにかして AppDomain Recycling を防止します (このリセット ロジックは、静的変数を使用する Windows フォームでは発生しません。両方の環境で同じ言語であると同様に機能するはずではありませんか? 少なくとも静的変数管理としての標準に関して)

  • これらの変数を保持する他の方法を使用します (ただし、すべてのユーザーのグローバル参照として情報に使用される値であるため、静的変数がパフォーマンス/コーディングに関して最良のオプションであると考えています)

  • これらの AppDomain Recycling でトリガーされるイベントをサブスクライブして、これらすべての変数を再初期化できるようにします (リサイクルを防止できない場合は、おそらく最良のオプションです...)

アイデア?

4

6 に答える 6

0

これに似たパターンに従って、この種の問題を解決しました。これにより、データが変更される可能性のある状況を処理することができました。ブートストラップで ISiteSettingRepository をセットアップしました。1 つのアプリケーションでは XML ファイルから構成を取得しますが、他のアプリケーションでは必要に応じてデータベースから取得します。

public class ApplicationSettings      
{
   public ApplicationSettings()
   {

   }
   public ApplicationSettings(ApplicationSettings settings)
   {
       ApplicationName = settings.ApplicationName;
       EncryptionAlgorithm = settings.EncryptionAlgorithm;
       EncryptionKey = settings.EncryptionKey;
       HashAlgorithm = settings.HashAlgorithm;
       HashKey = settings.HashKey;
       Duration = settings.Duration;
       BaseUrl = settings.BaseUrl;
       Id = settings.Id;

   }

 public string ApplicationName { get; set; }
 public string EncryptionAlgorithm { get; set; }
 public string EncryptionKey { get; set; }
 public string HashAlgorithm { get; set; }
 public string HashKey { get; set; }
 public int Duration { get; set; }
 public string BaseUrl { get; set; }
 public Guid Id { get; set; }

}

次に、「サービス」インターフェース

 public interface IApplicaitonSettingsService
{
   ApplicationSettings Get();
}

 public class ApplicationSettingsService : IApplicaitonSettingsService 
{
    private readonly ISiteSettingRepository _repository;

    public ApplicationSettingsService(ISiteSettingRepository repository)
    {
        _repository = repository;
    }

    public ApplicationSettings Get()
    {
        SiteSetting setting = _repository.GetAll();
        return setting;
    }
}
于 2013-06-21T13:00:36.957 に答える
0

web.configこれらの値をファイルに保存しConfiguationManager.AppSettingsて取得できない理由はありますか?

ConfigurationManager.AppSettings["MySetting"] ?? "defaultvalue";

あなたの編集を考慮して、最初に取得したときに必要な値をキャッシュしてみませんか?

var val = HttpContext.Cache["MySetting"];
if (val == null)
{
    val = // Database retrieval logic
    HttpContext.Cache["MySetting"] = val;
}
于 2013-06-21T12:29:18.143 に答える
0

私はまったく別のアプローチを取るでしょう。何も関与しないアプローチstaticです。

まず、目的の構成設定を厳密に型指定するクラスを作成します。

public class MyConfig
{
    int DecimalPlaces { get; set; }
    string AdministratorEmail { get; set; }
    //...
}

次に、いくつかのリポジトリを作成して永続化レイヤーを抽象化します。

public interface IMyConfigRepository
{
    MyConfig Load();
    void Save(MyConfig settings);
}

これらの設定を読み書きできるクラスは、このリポジトリの実装に依存していることを静的に宣言できます。

public class SomeClass
{
    private readonly IMyConfigRepository _repo;

    public MyClass(IMyConfigRepository repo)
    {
        _repo = repo;
    }

    public void DoSomethingThatNeedsTheConfigSettings()
    {
        var settings = _repo.Load();
        //...
    }
}

ここで、必要に応じてリポジトリ インターフェイスを実装し (今日はデータベース内の設定が必要で、明日は .xml ファイルにシリアル化し、来年はクラウド サービスを使用する可能性があります)、必要に応じて構成インターフェイスを実装します。

これで設定は完了です。必要なのは、インターフェイスをその実装にバインドする方法だけです。Ninject の例を次に示します (NinjectModule派生クラスのLoadメソッド オーバーライドで記述):

Bind<IMyConfigRepository>().To<MyConfigSqlRepository>();

MyConfigCloudRepository次に、実装が必要になったときに、または実装を交換するだけMyConfigXmlRepositoryです。

asp.net アプリケーションであるため、Global.asax(アプリの起動時に) ファイル内でこれらの依存関係を結び付けてください。そうすれば、IMyConfigRepositoryコンストラクター パラメーターを持つすべてのクラスに が挿入され、読み込めるオブジェクトMyConfigSqlRepositoryが提供されます。MyConfigImplementation好きなように保存してください。

IoC コンテナーを使用していない場合は、アプリnewの起動MyConfigSqlRepository時に を起動し、必要な型のコンストラクターにインスタンスを手動で挿入します。

このアプローチの唯一の点は、DependencyInjection に適したアプリ構造をまだ持っていない場合、大規模なリファクタリングを意味する可能性があることです。つまり、オブジェクトを分離newして依存関係を排除し、単体テストをより簡単に対象に集中させることができます。単一の側面であり、依存関係のモックアップがはるかに簡単です...他の利点の中でも.

于 2013-06-21T17:59:13.123 に答える