首先我要说的是,我希望这看起来不像我很懒,但我在理解以下项目中的一段代码时遇到了一些麻烦。
我正在浏览源代码,我发现了一些对我自己的小项目有用的东西。在他们的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被销毁,每个请求如何防止丢失用户对象?
无论如何,这是一个很长的问题,所以我很感激任何正确的方向。
答案 0 :(得分:0)
在Ninject中,您选择技术特定的扩展(Ninject.Web或Ninject.Web.Mvc)并使用InRequestScope来管理“.Items
上下文”中的内容。它们在请求结束时处理,并在后续请求中根据需要解决新的问题。
它肯定不会像你引用IMO的那些东西那么多代码或复杂:D