これまで、Sessionを使用して、あるページから別のページにいくつかの変数を渡していました。たとえば、ユーザーの役割。ユーザーがWebアプリケーションにログインすると、ユーザーのロールIDはセッションに保持され、そのロールはアプリケーションのさまざまな部分でチェックされます。私は最近、静的メンバーを代わりに使用しない理由を考え始めました。同じ情報を静的フィールドに格納して、アプリケーションのどこにでも簡単にアクセスできます(その静的フィールドが存在する名前空間が含まれている場所であればどこでも)。
上記とは別に、静的フィールドを使用してデータを格納し、どこでも使用できるようにする理由は他にありますか?
いいえ、これに静的変数を使用することはnotの方法です:
基本的に、アプリケーションの周囲に情報を伝播するには、2つの選択肢があります。
Ifロードバランシングを使用してすべてのユーザーが同じサーバーにアクセスできるようにすることができますif AppDomainがリサイクルされるときにセッションが失われることを気にしません1 またはサーバーがダウンした場合は、セッションIDをキーとしてメモリに保持できますが、注意してください。
1 これを乗り切るためのASP.NETのメカニズムがあり、セッション情報を1つのAppDomainから別のAppDomainに伝播する可能性があります-よくわかりません
それらは2つの非常に異なるものです。
セッションにはあらゆる種類のデータを保存できます。ただし、キャストする必要があります。ただし、静的フィールドは正しいデータ型のデータのみを受け入れます。
多くの場合、ヘルパークラスを使用してSession値を抽象化すると便利です。これにより、テスト容易性が向上し、プロパティを厳密に型指定して、クラスの内部でキャストを実行できるようになります。
例:
public List<int> UserRoles
{
get
{
// optionally check that the value is indeed in session, otherwise this
// will throw
return (List<int>)Session["UserRoles"];
}
}
以下も参照してください。
あなたは一つを忘れます(私は思う)
静的データは、アプリケーションのすべてのユーザーで同じですが、セッションは「ユーザーごと」です。
したがって、「ユーザーロール」のシナリオでは、面白い結果が期待できます;)
静的フィールドはすべてのユーザー間で共有されます。
Web環境では、いくつかのスレッドが一緒に実行されます。
静的メンバーを更新するには、適切な同時実行制御が必要です。これを誤ると、サイトのパフォーマンスが大幅に低下します。
セッションをプロセス外に移動して、Webファーム全体で共有できます。
アプリサーバーがクラッシュした場合でも、プロセス外セッションが存在します。