Asp.net mvc Asp.net Mvc-Kigg:在HttpContext中维护用户对象。请求之间的项

Asp.net mvc Asp.net Mvc-Kigg:在HttpContext中维护用户对象。请求之间的项,asp.net-mvc,unity-container,ninject,ninject-2,kigg,Asp.net Mvc,Unity Container,Ninject,Ninject 2,Kigg,首先我想说,我希望这看起来不像我很懒,但是我在理解下面项目中的一段代码时遇到了一些困难 我正在浏览源代码,我注意到一些对我自己正在做的小项目有用的东西。在BaseController中,它们具有以下代码: private static readonly Type CurrentUserKey = typeof(IUser); public IUser CurrentUser { get { if (!string.IsNullOrEmpty(CurrentUs

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

我正在浏览源代码,我注意到一些对我自己正在做的小项目有用的东西。在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中。我猜他们这样做是为了不必在每次需要用户对象时调用数据库

我不理解的部分是他们如何在请求之间维护这个对象。如果我正确理解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;
}
内部静态IDictionary GetInstances(HttpContextBase httpContext)
{
词典实例;
if(httpContext.Items.Contains(Key))
{
实例=(IDictionary)httpContext.Items[Key];
}
其他的
{
锁(httpContext.Items)
{
if(httpContext.Items.Contains(Key))
{
实例=(IDictionary)httpContext.Items[Key];
}
其他的
{
实例=新字典();
httpContext.Items.Add(键、实例);
}
}
}
返回实例;
}
这是我不明白的魔法发生的地方。我认为他们使用Unity对每个请求进行依赖注入?在我的项目中,我正在使用Ninject,我想知道如何才能得到相同的结果

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


不管怎么说,这是一个很长的问题,所以我非常感谢您朝着正确的方向努力。

在Ninject中,您可以选择特定于技术的扩展(Ninject.Web或Ninject.Web.Mvc),并使用InRequestScope管理“代码>项目”上下文中的内容。它们在请求结束时得到处理,新的将在后续请求中根据需要得到解决


它肯定不会像你引用的一些东西那样复杂,也不会像IMO:D

读一些关于Kigg和Unity的信息,现在我不知道最后一段代码是什么。我认为他们在请求之间保留用户对象也是错误的。我猜他们会将其存储在HttpContext.Items中,这样他们就只能为每个请求调用数据库一次。Items不在请求之间-只有会话可以这样做。例如,如果您执行异步工作并转移到另一个线程,则项目是一个在处理单个HTTP请求的不同阶段之间存储内容的地方。(因此我将InRequestScope与项目进行比较)