Ninject 总是注入 null HttpContext.Current()
Ninject always injects null HttpContext.Current()
我正在尝试通过 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
属性 仍然为空:
kernel.Bind<ICurrentUserProvider>().To<CurrentUserProvider>().InRequestScope()
.WithConstructorArgument("context", ninjectContext => HttpContext.Current);
在我看来,您过早地创建了 CurrentUserProvider
对象。如果你想在绑定时创建它,我相信你可以将你的代码更新为这样的:
kernel.Bind<ICurrentUserProvider>().ToMethod(context => new CurrentUserProvider(context)).InRequestScope();
感谢 NightOwl888 用 为我指明了正确的方向。
我没有尝试直接使用 HttpContext Ninject,而是按照这些行注入了一个工厂对象:
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); }
}
}
我正在尝试通过 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
属性 仍然为空:
kernel.Bind<ICurrentUserProvider>().To<CurrentUserProvider>().InRequestScope()
.WithConstructorArgument("context", ninjectContext => HttpContext.Current);
在我看来,您过早地创建了 CurrentUserProvider
对象。如果你想在绑定时创建它,我相信你可以将你的代码更新为这样的:
kernel.Bind<ICurrentUserProvider>().ToMethod(context => new CurrentUserProvider(context)).InRequestScope();
感谢 NightOwl888 用
我没有尝试直接使用 HttpContext Ninject,而是按照这些行注入了一个工厂对象:
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); }
}
}