C# 类中的IHttpContextAccessor为空

C# 类中的IHttpContextAccessor为空,c#,asp.net,asp.net-core-2.0,httpcontext,C#,Asp.net,Asp.net Core 2.0,Httpcontext,当我试图从类中的IHttpContextAccessor字段获取httpcontext时,我遇到了问题 这是我的startup.cs public void ConfigureServices(IServiceCollection services) { services.AddMvc(); services.AddDistributedMemoryCache(); services.AddSingleton<IHttpContextAccessor, HttpC

当我试图从类中的IHttpContextAccessor字段获取httpcontext时,我遇到了问题

这是我的startup.cs

public void ConfigureServices(IServiceCollection services)
{
    services.AddMvc();

    services.AddDistributedMemoryCache();
    services.AddSingleton<IHttpContextAccessor, HttpContextAccessor>();
    services.AddTransient<IUserContextServices, UserContextService>();
    services.AddSession(options =>
    {
        options.Cookie.Name = ".AdventureWorks.Session";
        options.IdleTimeout = TimeSpan.FromSeconds(10);
    });
}
httpContext在上述类中可用,并且还设置会话值,但当我尝试访问此类中的httpContext时,它会给我null对象引用

public class UserService
{
   private readonly IHttpContextAccessor contextAccessor;
    public IUserContextServices _userContext = new UserContextService();
   public UserService()
    {  
    }
 public bool CreateEmployee(AppEmployees appemployee, int RoleId, bool isEmailSend, out string error)
    {
appemployee.CreatedBy = _userContext.UserID(); //this line shows null reference exception
        appemployee.CreatedDate = DateTime.Now;
}

您正在使用无参数构造函数更新
UserContextService

public IUserContextServices _userContext = new UserContextService();
而不是依赖依赖依赖注入

您需要将
UserService
配置为与DI容器一起使用-通过构造函数注入

public class UserService
{
    private readonly IUserServiceContext _userServiceContext;

    public UserService(IUserServiceContext userServiceContext)
    {
        _userServiceContext = userServiceContext;
    }
}

您还需要修改Startup.cs以注册
用户服务
,并且您可能希望它也实现一个接口

您正在使用无参数构造函数更新
用户上下文服务

public IUserContextServices _userContext = new UserContextService();
而不是依赖依赖依赖注入

您需要将
UserService
配置为与DI容器一起使用-通过构造函数注入

public class UserService
{
    private readonly IUserServiceContext _userServiceContext;

    public UserService(IUserServiceContext userServiceContext)
    {
        _userServiceContext = userServiceContext;
    }
}

您还需要修改Startup.cs以注册
用户服务
,并且您可能希望它也实现一个接口

为什么在用户服务中使用默认构造函数

您将使用下一个代码:

public IUserContextServices _userContext = new UserContextService();
当然这里的
IHttpContextAccessor
为空

您需要在用户服务中使用DI

例如:

private readonly IUserContextService _userContextService;
public UserService(IUserContextService userContextService)
{  
    _userContextService = userContextService;
}

NET内核中的DI有很多优点。

为什么在用户服务中使用默认构造函数

您将使用下一个代码:

public IUserContextServices _userContext = new UserContextService();
当然这里的
IHttpContextAccessor
为空

您需要在用户服务中使用DI

例如:

private readonly IUserContextService _userContextService;
public UserService(IUserContextService userContextService)
{  
    _userContextService = userContextService;
}

NET内核中的DI有很多优点。

如果您将UserId直接设置为

public CurrentUserService(IHttpContextAccessor httpContextAccessor)
{
    UserId = httpContextAccessor.HttpContext?.User?.FindFirstValue(ClaimTypes.NameIdentifier);
}
通过这种方式,您可能会在大多数情况下获得null UserId,而不是像这样首先创建httpContextAccessor字段

public CurrentUserService(IHttpContextAccessor httpContextAccessor)
{
     this.httpContextAccessor = httpContextAccessor;
}
public string UserId { get { return httpContextAccessor.HttpContext?.User?.FindFirstValue(ClaimTypes.NameIdentifier); } }

然后获取UserId,这样就可以解决获取空UserId的问题。

如果您将UserId直接设置为

public CurrentUserService(IHttpContextAccessor httpContextAccessor)
{
    UserId = httpContextAccessor.HttpContext?.User?.FindFirstValue(ClaimTypes.NameIdentifier);
}
通过这种方式,您可能会在大多数情况下获得null UserId,而不是像这样首先创建httpContextAccessor字段

public CurrentUserService(IHttpContextAccessor httpContextAccessor)
{
     this.httpContextAccessor = httpContextAccessor;
}
public string UserId { get { return httpContextAccessor.HttpContext?.User?.FindFirstValue(ClaimTypes.NameIdentifier); } }

然后获取UserId,这样就可以解决获取null UserId的问题。

我需要访问任何类中的当前会话,我该如何做?我的意思是如何在任何类中调用IhttpContextAccessor?@AfaqRajput您需要通过构造函数使用注入。这是在必要的类中检索IHttpContextAccessor的最简单方法(如答案中所述)。还可以使用属性注入。在这种情况下,您可以使用IHttpContextAccessor作为公共属性。我需要在任何类中访问当前会话,我将如何做到这一点?我的意思是如何在任何类中调用IhttpContextAccessor?@AfaqRajput您需要通过构造函数使用注入。这是在必要的类中检索IHttpContextAccessor的最简单方法(如答案中所述)。还可以使用属性注入。在这种情况下,可以将IHttpContextAccessor用作公共属性。