Asp.net mvc Asp.net Mvc-Kigg:在HttpContext中维护用户对象。请求之间的项
首先我想说,我希望这看起来不像我很懒,但是我在理解下面项目中的一段代码时遇到了一些困难 我正在浏览源代码,我注意到一些对我自己正在做的小项目有用的东西。在BaseController中,它们具有以下代码: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
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与项目进行比较)