c# – 更好的做强类型ASP.NET MVC会话的方法 - 代码日志

c# – 更好的做强类型ASP.NET MVC会话的方法

我正在开发一个ASP.NET MVC项目,并希望使用强类型的会话对象。我已经实现了以下的Controller派生类来公开这个对象:

public class StrongController<_T> : Controller
    where _T : new()
{
    public _T SessionObject
    {
        get
        {
            if (Session[typeof(_T).FullName] == null)
            {
                _T newsession = new _T();
                Session[typeof(_T).FullName] = newsession;
                return newsession;
            }
            else
                return (_T)Session[typeof(_T).FullName];
        }
    }

}

这允许我为每个控制器定义一个会话对象,这符合控制器隔离的概念。是否有更好/更“正确”的方式,也许是微软官方支持的?

这样,其他对象将无法访问此对象(例如ActionFilter)。我这样做:

public interface IUserDataStorage<T>
{
   T Access { get; set; }
}

public class HttpUserDataStorage<T>: IUserDataStorage<T>
  where T : class
{
  public T Access
  {
     get { return HttpContext.Current.Session[typeof(T).FullName] as T; }
     set { HttpContext.Current.Session[typeof(T).FullName] = value; }
  }
}

然后,我可以在控制器的构造函数中注入IUserDataStorage,或者在ActionFilter内使用ServiceLocator.Current.GetInstance(typeof(IUserDataStorage?))。

public class MyController: Controller
{
   // automatically passed by IoC container
   public MyController(IUserDataStorage<MyObject> objectData)
   {
   }
}

当然,对于所有控制器需要这种情况(例如ICurrentUser),您可能需要使用属性注入。

http://stackoverflow.com/questions/1710875/better-way-of-doing-strongly-typed-asp-net-mvc-sessions

本站文章除注明转载外,均为本站原创或编译
转载请明显位置注明出处:c# – 更好的做强类型ASP.NET MVC会话的方法