2009-04-23 12 views
1

私はASP.NET Webサイトのメンテナンスに取り組んでいます。ビジネス層やその他のサポートライブラリがHttpContext.Current.Sessionを大量に使用していることに気付きました。これにより、セッション変数を把握するのが難しくなり、セッション変数が何のために使用されているのか、なぜそれらが存在するのかが決まります。Webサイトのビジネスレイヤがセッション状態にアクセスする必要がありますか?

ビジネスレイヤでセッションを使用することは悪い習慣と考えられますか?セッションを使用するすべてのコードをコードビハインドに移行させることが賢明でしょうか?

答えて

5

ほとんど決して良い考えではありません。そこの理由はたくさんありますが、ここではカップルだ:

  • あなたはASP.NET
  • 以外にビジネス層のコードを使用することはできないでしょう
  • ユニットテストは、痛みのはるかあるいは不可能になります。

私たちは、共通のビジネスレイヤーコードを利用したサービスを構築し始めた当時、まったく同じ状況で大きな頭痛に遭遇しました。

1

はい - BLはセッションに関する知識がないはずです。それはあなたが必要としない依存関係です。

1

インダイレクションであるクラスを作成します。この場合、Web上ではHttpContext.Current.Sessionから値を返し、他の領域では他の場所からそれを解決します。 IEはインターフェイスISessionStoreを持ち、具象クラスのWebSessionStoreとWindowsFormsSessionStoreなどを持っています。

これはコードをテストしやすくし、xビジネスロジックをWindowsサービスで実行するように拡張パスを提供しますy分ごとにx個のコードを実行できます。

3

私はこの規則に従います。System.Web名前空間(Javaのjavax.servletパッケージ)のクラスは、ビジネスレイヤーに存在してはいけません。

1

私の意見では、それは悪い習慣です。

これは、ビジネスレイヤーを環境から切り離すことをかなり困難にします。あなたが単体テストをすることを期待している場合、例えば、あなたは運がありません。

これを処理する方法の1つは、これを抽象化することです。これにより、HttpContextを参照せずに「状態キャッシュ」を渡すことができます。それは少なくともある程度抽象化されます。 さらに興味深いのは、ビジネス層がそれを参照する必要がある理由です。

+0

これは単体テストについての良い点です。ビジネス層でHttpContextが必要な理由は、ログインしているユーザーに関する情報(役割とアクセス許可など)がセッションに保持されるため、ビジネスロジックの機能に影響する可能性があります。私は州を抽象化し、それを渡すことを試みます - それは良い解決策のように思えます。 – tspauld

+0

その問題は、「現在のユーザー」は普及した概念であり、それを必要としないオブジェクトのレイヤーを通じて持ち歩くことになります。 IOCを使用する良い理由のように聞こえるが、それはまったく異なるボールゲームであり、簡単な変更ではない。 –

1

セッション/キャッシュや他の永続性メソッドとの完全なやりとりをカプセル化する集中キャッシュ/セッションマネージャーを常に持っている方がよいでしょう。あなたのBLをセッションとやりとりさせることは、間違いなく非常に悪い習慣であり、ある意味では、階層構造の目的を完全に破っています。

関連する問題