【发布时间】:2017-11-24 18:48:50
【问题描述】:
我有一个 UserContext 服务,我将在其中放置一些基本功能(“IsAuthenticated、GetUser 等...)
为此,我需要将 HTTPContext 从我的 WebAPI 控制器传递到我的类库服务。
实际上,HttpContext 在 web api 控制器中始终是 null。
有人有解决我的问题的方法吗? 有没有更好的方法来实现它。
Web API 用户控制器
[Route("api/[controller]")]
[Authorize]
public class UserController : Controller
{
private readonly IUserContextServices _userContextServices;
private readonly User loggedUser;
public UserController()
{
//HttpContext ALWAYS NULL
_userContextServices = new UserContextService(HttpContext);
}
}
用户上下文服务
namespace MyProj.Services
{
public interface IUserContextServices
{
UserContext GetUserContext();
bool IsUserAuthenticated();
}
public class UserContextService : IUserContextServices
{
private readonly HttpContext _context;
private UserContext _userContext;
public UserContextService(HttpContext context)
{
_context = context;
InitUserContext();
}
private IEnumerable<Claim> GetUserClaims()
{
if (IsUserAuthenticated())
{
return _context.User.Claims;
}
return null;
}
private void InitUserContext()
{
if (IsUserAuthenticated())
{
var claims = GetUserClaims();
_userContext = new UserContext();
_userContext.Email = claims.First(p => p.Type == "email").Value;
_userContext.AspNetUserID = claims.First(p => p.Type == "sub").Value;
}
}
public UserContext GetUserContext()
{
return _userContext;
}
public bool IsUserAuthenticated()
{
return _context.User != null && _context.User.Identity != null && _context.User.Identity.IsAuthenticated;
}
}
}
【问题讨论】:
-
在调用控制器的流程中,在创建控制器时 HttpContext 尚未准备好/未分配。重新考虑设计,以便在依赖类的生命周期后期注入上下文
-
构造函数后调用哪个方法?
标签: c# dependency-injection asp.net-core asp.net-core-webapi