【问题标题】:Asp.net Mvc - Kigg: Maintain User object in HttpContext.Items between requestsAsp.net Mvc - Kigg:在请求之间维护 HttpContext.Items 中的用户对象
【发布时间】:2023-03-04 23:06:01
【问题描述】:

首先我想说的是,我希望这看起来不像我很懒,但是我在理解以下项目中的一段代码时遇到了一些麻烦。

http://kigg.codeplex.com/

我正在浏览源代码,我注意到一些对我正在制作的小项目很有用的东西。在他们的 BaseController 中,他们有以下代码:

private static readonly Type CurrentUserKey = typeof(IUser);

public IUser CurrentUser
{
    get
    {
        if (!string.IsNullOrEmpty(CurrentUserName))
        {
            IUser user = HttpContext.Items[CurrentUserKey] as IUser;

            if (user == null)
            {
                user = AccountRepository.FindByClaim(CurrentUserName);

                if (user != null) 
                {
                    HttpContext.Items[CurrentUserKey] = user; 
                }
            }

            return user;
        }

        return null;
    }
}

这不是我根据需要稍微调整的代码的精确副本。这部分代码我还是看懂的。他们将 IUser 存储在 HttpContext.Items 中。我猜他们这样做是为了不必在每次需要 User 对象时调用数据库。

我不明白的部分是他们如何在请求之间维护这个对象。如果我理解正确,HttpContext.Items 是按请求缓存存储。

所以经过一番挖掘后,我找到了以下代码。

internal static IDictionary<UnityPerWebRequestLifetimeManager, object> GetInstances(HttpContextBase httpContext)
{
    IDictionary<UnityPerWebRequestLifetimeManager, object> instances;

    if (httpContext.Items.Contains(Key))
    {
        instances = (IDictionary<UnityPerWebRequestLifetimeManager, object>) httpContext.Items[Key];
    }
    else
    {
        lock (httpContext.Items)
        {
            if (httpContext.Items.Contains(Key))
            {
                instances = (IDictionary<UnityPerWebRequestLifetimeManager, object>) httpContext.Items[Key];
            }
            else
            {
                instances = new Dictionary<UnityPerWebRequestLifetimeManager, object>();
                httpContext.Items.Add(Key, instances);
            }
        }
    }

    return instances;
}

这是发生了一些我不理解的魔法的部分。我认为他们使用 Unity 对每个请求进行一些依赖注入?在我的项目中,我使用的是 Ninject,我想知道如何获得相同的结果。

我猜 Ninject 中的 InRequestScope 与 UnityPerWebRequestLifetimeManager 相同?我还想知道它们绑定到哪个接口的哪个类/方法?由于 HttpContext.Items 每次请求都会被销毁,它们如何防止丢失用户对象?

无论如何,这是一个很长的问题,所以我很感激任何朝着正确方向的推动。

【问题讨论】:

    标签: asp.net-mvc unity-container ninject ninject-2 kigg


    【解决方案1】:

    在 Ninject 中,您选择特定于技术的扩展程序(Ninject.Web 或 Ninject.Web.Mvc)并使用 InRequestScope 管理“.Items 上下文”中的内容。它们在请求结束时被处置,新的将在后续请求中根据需要解决。

    它绝对不会像你引用的一些东西那样多代码或复杂:D

    【讨论】:

    • 阅读一些关于 Kigg 和 Unity 的信息,现在我不确定最后一段代码的作用。我认为他们在请求之间保留 User 对象也是错误的。我猜他们将它存储在 HttpContext.Items 中,这样他们每次请求只需调用一次数据库。
    • 项目不在请求之间 - 只有会话可以做到这一点。例如,如果您执行异步工作并移至另一个线程,则 Items 是一个在处理单个 HTTP 请求的不同阶段之间存储内容的地方。 (因此我将 InRequestScope 与 Items 进行比较)
    猜你喜欢
    • 1970-01-01
    • 2011-08-07
    • 2011-10-26
    • 2010-11-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多