【问题标题】:How to implement a UserFactory using IHttpContextAccessor如何使用 IHttpContextAccessor 实现 UserFactory
【发布时间】:2015-09-01 16:58:53
【问题描述】:

我曾经有一个使用 HttpContext.CurrentUserFactory(在 vNext 之前),但现在它已经消失了,我无法重新创建它。

我希望它是一个静态类,可以设置和获取当前用户在整个应用程序中访问用户数据。

我知道我必须使用 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 实例?

【问题讨论】:

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


    【解决方案1】:

    我建议您将UserFactory 类设为非静态并将其注册为作用域:

    services.AddScoped<UserFactory>();
    

    这将为每个 Web 请求创建一个实例。您可以将其注入到其他所有类中,并让 UserFactory 依赖于 IHttpContextAccessor 以获取当前的 HttpContext。

    这符合微软试图在 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 也将被解析。

    【讨论】:

    • 如何使用UserFactory?能否提供一个完整的解决方案?
    • 你现在在哪里使用它?例如:您可以使用构造函数注入在控制器中注入一个实例。
    • 我已经在控制器中有上下文。其他地方呢?代码人,我需要代码。
    • 除了控制器还有哪些地方需要它?它始终是请求的入口点。此外,乞求这样的代码不会让你走得太远。
    • 展示了如何在控制器中注入,但在其他任何地方我如何才能获得IHttpContextAccessor 的实例?如果我放入构造函数,我仍然需要在创建“UserFactory”实例时传递一个实现
    猜你喜欢
    • 1970-01-01
    • 2019-12-01
    • 2020-10-05
    • 2016-09-16
    • 2016-11-01
    • 1970-01-01
    • 1970-01-01
    • 2021-11-30
    • 1970-01-01
    相关资源
    最近更新 更多