2009-04-09 11 views

答えて

33

私は依存性注入を使用し、HttpContextのインスタンス(または単にセッション)をセッションにアクセスする必要のあるクラスに渡します。もう1つの選択肢は、HttpContext.Currentを参照することですが、静的オブジェクトなのでテストするのが難しくなります。

public ActionResult MyAction() 
    { 

     var foo = new Foo(this.HttpContext); 
     ... 
    } 


    public class Foo 
    { 
     private HttpContextBase Context { get; set; } 

     public Foo(HttpContextBase context) 
     { 
      this.Context = context; 
     } 

     public void Bar() 
     { 
      var value = this.Context.Session["barKey"]; 
      ... 
     } 
    } 
+1

が応答をいただき、ありがとうございます。いくつかのDependency Injectionフレームワークがあるように見えます。どのDIフレームワークをお勧めしますか? DIに関する記事を読む必要がありますか? :) – xraminx

+1

これは元のポスターが求めていたもののために過度に複雑に思えます。 –

+1

@xraminx - 私がDIフレームワークに示唆していることを混同しないでください。私はフレームワークではなく、パターンであるDIを使用することについて話しています。そのアイデアは、依存関係のインスタンスを作成するか、静的インスタンスを使用するのではなく、依存関係のインスタンスをクラスに渡すことです。 mockingによる単体テストはずっと簡単です。 – tvanfosson

0

はそれを自分自身を行っていないが、チャドマイヤーさんのブログから、このサンプルは、(この記事から:http://www.chadmyers.com/Blog/archive/2007/11/30/asp.net-webforms-and-mvc-in-the-same-project.aspx)役立つかもしれないあなただけそうのようなHttpContextを通してそれを呼び出す必要が

[ControllerAction] 
public void Edit(int id) 
{ 
    IHttpSessionState session = HttpContext.Session; 

    if (session["LoggedIn"] == null || ((bool)session["LoggedIn"] != true)) 
     RenderView("NotLoggedIn"); 

    Product p = SomeFancyDataAccess.GetProductByID(id); 

    RenderView("Edit", p); 
} 
20

HttpContext.Current.Session["MyValue"] = "Something"; 
+1

@Nick - 静的なHttpContextを模擬してユニットテストを試して、それがいかに簡単かを見てください。私はそれをした - いいえ、ありがとう。 – tvanfosson

+2

FYI - フレームワーク設計者がHttpSessionStateBaseとHttpContextBaseを新しいバージョンのフレームワークに導入した理由とコントローラコンテキストを変更してコントローラのHttpContextを変更できる理由があります。それはあなたの行動を単体テストすることをはるかに簡単にします。 – tvanfosson

+14

オリジナルのポスターはテストについて尋ねたことがありません。彼はセッションにどのようにアクセスできるか尋ねました。 –

0

また、すべてのセッション変数を単一のクラスファイルにラップします。そうすれば、intelliSenseを使って選択することができます。これにより、セッションの「文字列」を指定する必要のあるコードのペース数が削減されます。

1

これは私のこの問題の解決策です。私も、同様に唯一の主要な違いを依存性注入を使用していることに注意してくださいここでシングルトン

private iSession _Session; 

private iSession InternalSession 
{ 
    get 
    { 

     if (_Session == null) 
     {     
      _Session = new SessionDecorator(this.Session); 
     } 
     return _Session; 
    } 
} 

は周りのセッションをラップするDecoratorパターンを使用していますSessionDecoratorクラスで、投げた「セッション」オブジェクトがアクセスされたということですインターフェース:

public class SessionDecorator : iSession 
{ 
    private HttpSessionStateBase _Session; 
    private const string SESSIONKEY1= "SESSIONKEY1"; 
    private const string SESSIONKEY2= "SESSIONKEY2"; 

    public SessionDecorator(HttpSessionStateBase session) 
    { 
     _Session = session; 
    } 

    int iSession.AValue 
    { 
      get 
     { 
      return _Session[SESSIONKEY1] == null ? 1 : Convert.ToInt32(_Session[SESSIONKEY1]); 
     } 
     set 
     { 
      _Session[SESSIONKEY1] = value; 
     } 
    } 

    int iSession.AnotherValue 
    { 
     get 
     { 
      return _Session[SESSIONKEY2] == null ? 0 : Convert.ToInt32(_Session[SESSIONKEY2]); 
     } 
     set 
     { 
      _Session[SESSIONKEY2] = value; 
     } 
    } 
}` 

・ホープ、このことができます:)

関連する問題