1

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

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

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

4

1 回答 1

0

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

它绝对不会像你引用的一些东西那样多的代码或复杂的海事组织:D

于 2010-05-14T14:30:38.103 回答