保守性をさらに高めましょう。セッションの使用に関する他の回答を引用します。
ショッピング カートを ASP.NET MVC アプリケーションのセッションに保存するとします。に格納されますがSession["ShoppingCart"]
、簡単で厳密に型指定されたアクセスと高いテスト容易性が必要です。
まず、インターフェースを定義します。
public interface ISessionWrapper
{
List<CartItem> ShoppingCart { get; set; }
}
次に、HttpContext の実装を作成します。
public class HttpContextSessionWrapper : ISessionWrapper
{
private T GetFromSession<T>(string key)
{
return (T) HttpContext.Current.Session[key];
}
private void SetInSession(string key, object value)
{
HttpContext.Current.Session[key] = value;
}
public List<CartItem> ShoppingCart
{
get { return GetFromSession<List<CartItem>>("ShoppingCart"); }
set { SetInSession("ShoppingCart", value); }
}
}
GetFromSession と SetInSession は、Session でのデータの取得と設定を容易にするヘルパー メソッドです。これらは、Session の他のフィールドにアクセスするために簡単に再利用できます。
次に、ベース コントローラーを定義します (ASP.NET MVC に適用可能)。
public class BaseController : Controller
{
public ISessionWrapper SessionWrapper { get; set; }
public BaseController()
{
SessionWrapper = new HttpContextSessionWrapper();
}
}
コントローラーの外部でセッションを使用する場合は、新しい HttpContextSessionWrapper() を作成または挿入するだけです。
Controller テストで SessionWrapper を ISessionWrapper モックに置き換えることができるため、HttpContext に依存しなくなります。を呼び出す代わりに を呼び出すため、Session もより使いやすくなり(List<CartItem>)Session["ShoppingCart"]
ますSessionWrapper.ShoppingCart
。見た目が良くなりましたね。
ビューにモデル クラスを使用せず、モデル クラスを使用する方がよいと思われる場合は、ViewData でも同じことができます。
public interface IViewDataWrapper
{
List<CartItem> ShoppingCart { get; set; }
}
public class ViewDataWrapper : IViewDataWrapper
{
}
public class BaseController : Controller
{
public IViewDataWrapper ViewDataWrapper { get; set; }
public BaseController()
{
IViewDataWrapper = new ViewDataWrapper();
}
}
そして、単純にコントローラーで:
ViewDataWrapper.ShoppingCart = SessionWrapper.ShoppingCart
または、ViewData と特定のモデルを使用しないことにした場合:
Model.ShoppingCart = SessionWrapper.ShoppingCart
そして単にビューで(ビューの基本クラスを定義し、このインターフェースを導入した場合):
<%= ViewDataWrapper.ShoppingCart %>
また
<%= Model.ShoppingCart %>
文字列のタイプミスがなく、厳密にタイプされ、見栄えが良い。