Asp.net Mvc - Kigg:在请求之间维护HttpContext.Items中的User对象

时间:2010-05-13 17:20:17

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

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

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被销毁,每个请求如何防止丢失用户对象?

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

1 个答案:

答案 0 :(得分:0)

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

它肯定不会像你引用IMO的那些东西那么多代码或复杂:D