2013-05-29 10 views
5

にカスタムクラスを追加します。は、ASP.NET MVCのC#プロジェクトでのHttpContext

を私は現在、その要求にどこでも使用するプロパティを保存するためにHttpContext.Itemsを使用しています。

<pages pageBaseType="Project.CustomWebViewPage"> 

:私はビューのweb.configファイルで、このようなデフォルトWebViewPageをオーバーライドしていますので、これは、ビューで取得するために、正常に動作します

HttpContext.Items["IUser"] = new CustomClass(“parameter”); 

: これは私がコントローラに持っているものですCustomWebViewPage内部Iは、プロパティを作成し、このようなInitHelpers()メソッドでそれを設定します。私は私のモデル/のviewmodelsでそれを取得したい場合は、しかし、

IUser = (CustomClass)HttpContext.Current.Items["IUser"]; 

私はそのコードをどこにでも置く必要があります。そのため、HttpContextの中にCustomClassを直接作成することを考えました(少なくともタイプキャストする必要はありません)。しかし、オーバーライドを行う方法や、そのオブジェクトを動的に追加します。

答えて

9

拡張メソッドを作成できます。このような何か:

public static class HttpContextExtensions 
{ 
    public static CustomClass GetUser(this HttpContextBase context) 
    { 
     return (CustomClass)context.Items["IUser"]; 
    } 
} 

次に、あなたがこのようにそれを呼び出します。

var user = HttpContext.Current.GetUser(); 
5

私は最近、同様の問題に直面しました。 WebFormsで作業している間、私のソリューションはMVCにも当てはまるはずです。

リクエストごとにDAL /ビジネスロジックレイヤにアクセスするための新しいオブジェクトを作成しました。これにより、リクエストの所要時間にかかわらず、または同時に実行される複数のリクエストがある場合でも、ロジックの変更を実行できます。また、要求が終了したときにオブジェクトの廃棄を保証することもできました。

私の最初の考えは、HttpContextBaseのカスタム実装を作成することでしたが、要求のためにHttpContextの作成を上書きする方法が見つかりませんでした。

だから、最終的に私はすべてのロジックをカプセル化する拡張メソッドを導入しました:

var user = Request.RequestContext.HttpContext.GetIUser(); 

public static class HttpContextExtensions 
{ 
    public static CustomClass GetIUser(this HttpContextBase Context) 
    { 
     return Context.Items["IUser"] as CustomClass; 
    } 
} 

今、あなたのコードは、のように簡単になります

関連する問題