我有netcore webapi项目,并且我正在使用Lamar进行DI。我有一个MyContextService服务,我注册为作用域
public class LifetimeRegistry : ServiceRegistry
{
public LifetimeRegistry()
{
this.AddScoped<MyContextService>();
}
}
我在2个地方使用此服务,首先是在授权处理程序中(在这里我也设置了上下文)。
public class TokenRequirement : IAuthorizationRequirement { }
public class TokenRequirementHandler : AuthorizationHandler<TokenRequirement>, IAuthorizationRequirement
{
private readonly MyContextService _cxtService;
public TokenRequirementHandler(MyContextService cxtService)
{
_cxtService = _cxtService;
}
protected override Task HandleRequirementAsync(AuthorizationHandlerContext context, TokenRequirement requirement)
{
// other code..
_cxtService.InitContext(); // This sets some context that's valid for this http request
}
}
第二位在控制器中
[Authorize(Policy = "TokenRequired")]
public class MyController
{
private readonly MyContextService _cxtService;
public MyController(MyContextService cxtService)
{
_cxtService = _cxtService;
// The context is null & service has a different hashcode
var cxt = _cxtService.GetContext();
}
}
在此控制器中,我希望设置上下文,但没有设置,并且我注意到2个实例具有不同的哈希码。我在这里做什么错了?
答案 0 :(得分:0)
回答我自己的问题,希望这对其他人有帮助。问题在于queue
是单例,而TokenRequirementHandler
是作用域。当您考虑它时,这很有道理,但当时还不那么明显。
我的解决方案是使MyContextService
具有范围。