我正在尝试创建一个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");
}
}
我收到以下错误:
>应用程序中的服务器错误。没有为此对象定义无参数构造函数。
答案 0 :(得分:0)
您的控制器需要ISessionState
参数。但那是你的界面。基础结构将不知道如何提供它,而是需要一个空构造函数。
您需要找到一种方法来拥有一个空的构造函数并初始化您的成员,尤其是您的包装器。也许在Initialize?
答案 1 :(得分:0)
要在控制器中使用带参数的构造函数,您需要使用依赖注入(这是一个很好的做法)。我个人对SimpleInjector有很好的经验,但还有很多其他人可以做到这一点。