Ninject总是注入null HttpContext.Current()

时间:2015-03-13 17:25:24

标签: c# asp.net-mvc asp.net-mvc-4 ninject

我试图通过Ninject注入一个UserFactory,这是我的绑定:

  var u = new CurrentUserProvider(HttpContext.Current);
            kernel.Bind<ICurrentUserProvider>().ToMethod(context => u).InRequestScope();

此工厂使用HttpContext读取身份验证cookie并填充CurrentUser对象,HttpContext作为构造函数参数传递:

 public class CurrentUserProvider : ICurrentUserProvider
{
    public ICurrentUser CurrentUser { get; set; }

    public CurrentUserProvider(HttpContext context)
    {
        CurrentUser = GetCurrentUser(context);
    }

    private static ICurrentUser GetCurrentUser(HttpContext ctx)
    {
        var httpCookie = ctx.Request.Cookies[".ASPXAUTH"];

        if (httpCookie != null)
        {
            var cookie = httpCookie.Value;
            var ticket = FormsAuthentication.Decrypt(cookie);

            if (ticket != null)
            {
                var x = ticket.UserData.FromJson<CurrentUser>();
                ctx.Session["UserID"] = x.DatabaseName;
                return x;
            }
        }
        return null;
    }
}

然而,传递给UserFactory构造函数的HttpContext始终为null。这是一个MVC4项目,如果这对方法有任何影响。

更新: 我也尝试了以下代码,它没有错误,但我注入的CurrentUserProvider属性仍为null:

 kernel.Bind<ICurrentUserProvider>().To<CurrentUserProvider>().InRequestScope()
            .WithConstructorArgument("context", ninjectContext => HttpContext.Current);

2 个答案:

答案 0 :(得分:1)

感谢NightOwl888用this answer指示我正确的方向。

我没有尝试直接使用Ninject使用HttpContext,而是沿着这些行注入了一个工厂对象:

  public class AspNetUserContext : IUserContext
{
    public User CurrentUser
    {
        // Do not inject HttpContext in the ctor, but use it
        // here in this property
        get { return new User(HttpContext.Current.User); }
    }
}

答案 1 :(得分:0)

我认为你过早地创建了CurrentUserProvider对象。如果您希望在绑定时创建它,我相信您可以将代码更新为:

    kernel.Bind<ICurrentUserProvider>().ToMethod(context => new CurrentUserProvider(context)).InRequestScope();