首先我想说我希望这看起来不像我很懒,但是我在理解以下项目中的一段代码时遇到了一些麻烦。
我正在浏览源代码,我注意到一些对我自己正在制作的小项目有用的东西。在他们的 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 在每个请求中都被销毁,它们如何防止丢失用户对象?
无论如何,这是一个很长的问题,所以我很感激任何朝着正确方向的推动。