我曾经使用UserFactory
(在vNext之前)使用HttpContext.Current
,但由于现在已经不见了,我无法重新创建它。
我希望它是一个静态类,设置并让当前用户访问整个应用程序中的用户数据。
我知道我必须使用DI系统但不确定如何。
到目前为止代码:
public class CurrentContext : IHttpContextAccessor
{
private IHttpContextAccessor ctx;
public HttpContext HttpContext
{
get
{
return ctx.HttpContext;
}
set
{
ctx.HttpContext = value;
}
}
}
services.AddTransient<IHttpContextAccessor, CurrentContext>();
public class UserFactory
{
private IHttpContextAccessor _context;
public UserFactory(IHttpContextAccessor Context)
{
_context = Context;
}
public void Add(string s) => _context.HttpContext.Session.SetString(s, s);
public string Get(string s) => _context.HttpContext.Session.GetString(s);
}
如何使用当前上下文在我的应用中的任何位置获取UserFactory
实例?
答案 0 :(得分:0)
我建议你使UserFactory
类非静态并将其注册为作用域:
services.AddScoped<UserFactory>();
这将为每个Web请求创建一个实例。您可以将其注入到每个其他类中,并让UserFactory
依赖IHttpContextAccessor
来获取当前的HttpContext。
这坚持了Microsoft试图在ASP.NET 5中实现的依赖性反转理念。静态类并不真正适合这种情况,应尽可能避免使用。
示例强>
UserFactory
上课:
public class UserFactory
{
private readonly IHttpContextAccessor _httpContextAccessor;
public UserFactory(IHttpContextAccessor httpContextAccessor)
{
_httpContextAccessor = httpContextAccessor;
}
// other code...
}
ConfigureServices()
课程中的 Startup
:
public void ConfigureServices(IServiceCollection services)
{
// ...
services.AddScoped<UserFactory>();
// ...
}
现在,您可以在控制器中注入UserFactory
的实例,例如:
public class SomeController : Controller
{
private readonly UserFactory _userFactory;
public SomeController(UserFactory userFactory)
{
_userFactory = userFactory;
}
// ...
}
现在,当UserFactory
开始解决时,IHttpContextFactory
内的UserFactory
也将得到解决。