有没有一种简单的方法可以让ClassLibrary获得会话值?

时间:2019-05-08 07:49:58

标签: c# asp.net-core httpcontext

我有一个外部ClassLibrary项目,需要从Main Project中的HomeController中获取会话值设置。 有没有简单的方法可以做到这一点?

或者是否可以将值从HomeController传输到外部ClassLibrary?

3 个答案:

答案 0 :(得分:2)

您可以使用IHttpContextAccessor class

  

对于需要访问以下内容的其他框架和自定义组件   HttpContext,推荐的方法是注册一个依赖项   使用内置的依赖项注入容器。依赖   注入容器将IHttpContextAccessor提供给任何类   在其构造函数中将其声明为依赖项。

public void ConfigureServices(IServiceCollection services)
{
     services.AddMvc()
         .SetCompatibilityVersion(CompatibilityVersion.Version_2_1);
     services.AddHttpContextAccessor();
     services.AddTransient<IUserRepository, UserRepository>(); 
}
     

在以下示例中:

     
      
  • UserRepository声明其对IHttpContextAccessor的依赖。
  •   
  • 当依赖项注入解析依赖关系链并创建UserRepository的实例时,将提供依赖项。
  •   
     

public class UserRepository : IUserRepository
{
    private readonly IHttpContextAccessor _httpContextAccessor;

    public UserRepository(IHttpContextAccessor httpContextAccessor)
    {
        _httpContextAccessor = httpContextAccessor;
    }

    public void LogCurrentUser()
    {
        var username = _httpContextAccessor.HttpContext.User.Identity.Name;
        service.LogAccessRequest(username);
    }
}

不要忘记添加services.AddHttpContextAccessor();来使依赖项注入正常工作。

答案 1 :(得分:2)

单一责任原则规定,一个类应该只做一件事。尽管您可以注入类似IHttpContextAccessor的东西,然后要求该类具有HttpContextSession之类的概念知识,以及它首先是在Web环境中使用的事实,等等。

正确的方法是注入或传递。如果该类需要会话变量中的特定值,请在该逻辑实际所属的控制器中访问该会话,然后仅将会话中的值传递给您的外部类。

答案 2 :(得分:-1)

如果您使用Abp模板,则Abp应用程序服务For example: T1:id | t2_id __________ 1 | 30 2 | 24 . | _ . | _ 90 | 80 T2: id ____ 1 2 . . 90 已包含属性ApplicationService,则您可以继承此类。