【问题标题】:Creating a wrapper around the Session object在 Session 对象周围创建一个包装器
【发布时间】:2015-04-09 00:24:25
【问题描述】:

我正在尝试创建一个 SessionWrapper 类,我可以在我的 MVC 应用程序中管理会话。为此,我认为最好的方法是为 HttpContext 创建一个包装类,然后允许我访问 HttpContext.Current.Session。

SessionState 接口

public interface ISessionState
{
    void Clear();
    void Delete(string key);
    object Get(string key);
    T Get<T>(string key) where T : class;
    ISessionState Store(string key, object value);
}

SessionState 类

public class DefaultSessionState : ISessionState
{
    private readonly HttpSessionStateBase _session;

    public DefaultSessionState(HttpSessionStateBase session)
    {
        _session = session;
    }

    public void Clear()
    {
        _session.RemoveAll();
    }

    public void Delete(string key)
    {
        _session.Remove(key);
    }

    public object Get(string key)
    {
        return _session[key];
    }

    public T Get<T>(string key) where T : class
    {
        return _session[key] as T;
    }

    public ISessionState Store(string key, object value)
    {
        _session[key] = value;

        return this;
    }
}

BaseController 类

public abstract class BaseController : Controller
{
    private readonly ISessionState _sessionState;

    protected BaseController(ISessionState sessionState)
    {
        _sessionState = sessionState;
    }

    internal protected ISessionState SessionState 
    { 
        get { return _sessionState; } 
    }
}

使用 SessionState 包装器

public class UserController : BaseController
{
    public UserController(ISessionState sessionState) : base(sessionState) { }

    public ActionResult Index()
    {
        // clear the session and add some data
        SessionState.Clear();
        SessionState.Store("key", "some value");
    }
}

我收到以下错误:

“/”应用程序中的服务器错误。

没有为此对象定义无参数构造函数。

【问题讨论】:

  • 对于 UserController,看起来您有名称为“MyController”的构造函数。这是您的代码中的错字还是真的像这样?此外,它们也不是您的 UserController 构造函数上的右括号。
  • 它的错字我会更新它,但如果我缺少任何右大括号或左大括号,我将永远无法获得运行时错误:)
  • 这就是我的想法,只是确保:)

标签: c# asp.net-mvc asp.net-mvc-4 session


【解决方案1】:

您的控制器需要一个ISessionState 参数。但那是你的界面。基础设施不知道如何提供它,而是需要一个空的构造函数。

您需要找到一种方法来创建一个空的构造函数并在某处初始化您的成员,尤其是您的包装器。也许在Initialize

【讨论】:

  • 我认为你是对的,我也是这么认为的,但是我该如何初始化
【解决方案2】:

要在控制器中使用带参数的构造函数,您需要使用依赖注入(无论如何这是一个很好的做法)。就我个人而言,我对 SimpleInjector 有很好的体验,但还有很多其他人可以胜任这项工作。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-03-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-04-20
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多