如何使用IHttpContextAccessor实现UserFactory

时间:2015-08-31 16:54:23

标签: c# asp.net-core asp.net-core-mvc

我曾经使用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实例?

1 个答案:

答案 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也将得到解决。