gpt4 book ai didi

asp.net-mvc - 我应该在哪里附加 ASP.NET MVC3 中的自定义用户上下文 session 包装器?

转载 作者:行者123 更新时间:2023-12-03 14:54:44 25 4
gpt4 key购买 nike

我已经阅读了许多关于 MVC 中 Session-scoped data 的帖子,但我仍然不清楚在解决方案中包含自定义 Session 包装器的正确位置。

我想从 IPrincipal 获取当前用户的用户名,加载有关该用户的附加信息并将其存储在 Session 中。然后我想从 访问该用户数据 Controller 和 View .

以下方法似乎都不适合我想做的事情。

选项 1:直接访问 Session 集合

每个人似乎都同意this is a bad idea ,但老实说,这似乎是最简单的工作。但是,它不会使用户对 View 可用。

public class ControllerBase : Controller {
public ControllerBase() : this(new UserRepository()) {}
public ControllerBase(IUserRepository userRepository) {
_userRepository = userRepository;
}
protected IUserRepository _userRepository = null;
protected const string _userSessionKey = "ControllerBase_UserSessionKey";
protected User {
get {
var user = HttpContext.Current.Session[_userSessionKey] as User;
if (user == null) {
var principal = this.HttpContext.User;
if (principal != null) {
user = _userRepository.LoadByName(principal.Identity.Name);
HttpContext.Current.Session[_userSessionKey] = user;
}
}
return user;
}
}
}

选项 2:将 Session 注入(inject)类构造函数 forum post

这个选项看起来不错,但我仍然不确定如何将它附加到 Controller 和 View 。我可以在 Controller 中新建它,但它不应该作为依赖注入(inject)吗?
public class UserContext {
public UserContext()
: this(new HttpSessionStateWrapper(HttpContext.Current.Session),
new UserRepository()) { }

public UserContext(HttpSessionStateBase sessionWrapper, IUserRepository userRepository) {
Session = sessionWrapper;
UserRepository = userRepository;
}

private HttpSessionStateBase Session { get; set; }
private IUserRepository UserRepository{ get; set; }

public User Current {
get {
//see same code as option one
}
}
}

选项 3:使用 Brad Wilson 的 StatefulStorage 类

在他的 presentation Brad Wilson 以他的 StatefulStorage 类为特色。它是一组聪明而有用的类,包括接口(interface)并使用构造函数注入(inject)。但是,它似乎使我走上了与选项 2 相同的道路。它使用接口(interface),但我不能使用 Container 来注入(inject)它,因为它依赖于静态工厂。即使我可以注入(inject)它,它是如何传递给 View 的。每个 ViewModel 都必须有一个带有可设置 User 属性的基类吗?

选项 4:使用类似于 Hanselman IPrincipal ModelBinder 的东西

我可以将 User 作为参数添加到 Action 方法中,并使用 ModelBinder 从 Session 中对其进行水合。在需要的地方添加它似乎有很多开销。另外,我仍然必须将其添加到 ViewModel 以使其对 View 可用。
public ActionResult Edit(int id, 
[ModelBinder(typeof(IPrincipalModelBinder))] IPrincipal user)
{ ... }

我觉得我想多了,但似乎也应该有一个明显的地方来做这种事情。我错过了什么?

最佳答案

我的 session 方法:

带接口(interface)的覆盖 session :

public interface ISessionWrapper
{
int SomeInteger { get; set; }
}

使用 HttpContext.Current.Session 实现接口(interface):
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 int SomeInteger
{
get { return GetFromSession<int>("SomeInteger"); }
set { SetInSession("SomeInteger", value); }
}
}

注入(inject) Controller :
public class BaseController : Controller
{
public ISessionWrapper SessionWrapper { get; set; }

public BaseController(ISessionWrapper sessionWrapper)
{
SessionWrapper = sessionWrapper;
}
}

Ninject 依赖:
Bind<ISessionWrapper>().To<HttpContextSessionWrapper>()

您可以使用 ViewData 传递一些常用信息当您想在母版页中使用它并在特定 View 中使用 View 模型时。

关于asp.net-mvc - 我应该在哪里附加 ASP.NET MVC3 中的自定义用户上下文 session 包装器?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5060804/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com