2012-04-15 10 views
2

私TREIDはdataAceess層でのHttpContextを使用するが、私は使用するHttpContext

HttpContext httpContext = HttpContext.Current; 

は、私は、WebアプリケーションとliberyプロジェクトをクリートのHttpContextからオブジェクトをクリートカントと私はliberyプロジェクトでのHttpContextを使用したいですこのように:

public static Context GetContextPerRequest() 
    { 

     HttpContext httpContext = HttpContext.Current; 
     if (httpContext == null) 
     { 
      return new Context(); 
     } 
     else 
     { 
      int contextId = Thread.CurrentContext.ContextID; 
      int hashCode = httpContext.GetHashCode(); 
      string key = string.Concat(hashCode, contextId); 

      Context context = httpContext.Items[key] as Context; 
      if (context == null) 
      { 
       context = new Context(); 
       httpContext.Items[key] = context; 
      } 

      return context; 
     } 
    } 

私はあなたのプレゼンテーション層からHttpContext.Currentを解析し、以下のようにあなたの方法を変更することができます.NET 4.

+1

にGetContextPerRequest()からオブジェクトを作ります。これを行うと、 "データアクセスレイヤー"とASP.NET Webアプリケーションのみが強く結びついています。 WCFサービスまたはWPFアプリケーション...私はこれを本当に、本当に悪いデザインと考えています... –

+0

最も簡単な解決策は、System.Webへの参照を追加することです –

答えて

0

私は、このように私の問題を解決する:

  1. はのsystem.webを使用して
  2. をSystem.Webのために参照を追加します。私のデータアクセス層に
  3. は、データアクセス層は、** ** `HttpContext`のようなUI指向のコンポーネントに依存すべきではないメソッドconsractor
3

を使用しています。現在のhttpコンテキストthisにアクセスする方法を見つける必要がある場合は、リンクが役立ちます。

public static Context GetContextPerRequest(HttpContext httpContext) 
    { 
     ------ 
     ------ 
    } 
1

あなたの質問は何か分かりませんが、あなたのコードはいくつかの非常に悪い概念を示しています。

これは何をする予定ですか?

int contextId = Thread.CurrentContext.ContextID; 
int hashCode = httpContext.GetHashCode(); 
string key = string.Concat(hashCode, contextId); 

Context context = httpContext.Items[key] as Context; 
if (context == null) 
{ 
    context = new Context(); 
    httpContext.Items[key] = context; 
} 

HttpContextは、ASP.NETでのHTTP要求処理用の安全なストレージです。 HttpContext.Currentはすべてのリクエストに対して一意のインスタンスを返します。このインスタンスはリクエストを処理するスレッドでは独立しています - 非同期処理の場合でも、HttpContextはリクエストからスレッドへと流れますが、独自のスレッドを生成する)。独自のスレッドを生成しようとすると、HttpContextインスタンスは要求が処理されるまで存在しますが、カスタムスレッドの存続時間は長くなる可能性があるため、この方法はまったく使用できません。

あなたが使用しているコードがこれのちょうどovercomplicatedバージョンです:このコードは、それが間違っ最新デザインで、あなたのデータアクセス層からのものである場合も

Context context = httpContext.Items["Context"] as Context; 
if (context == null) 
{ 
    context = new Context(); 
    httpContext.Items["Context"] = context; 
} 

。データアクセスレイヤーはデータアクセスを扱い、HTTP要求処理を含む上位処理では独立している必要があります。これは、あなたのGetContextPerRequestメソッドがデータアクセスレイヤーに属していないことを意味します。

+0

ちょうどあなたの答えを読んで、それが正しく理解しているのだろうかと思っていた。非同期作業を行うときに同じHttpContextで2つ以上のスレッドが動作し、コンテキストが自動的に切り替えられ/同期される可能性はありますか(HttpContext.Currentをパラメータとして新しいスレッドに渡すこともできます)。その場合、HttpContext.Items []を設定してロックを実装して、他のスレッドでも発生しないようにする必要があります。 – MartinF

+0

それは、実行中のスレッドが排他的な読み書きロック(またはコピー)を取得し、スレッドが終了するまで他のスレッドが使用できるSession.Itemsのようなものですか? – MartinF

関連する問題