Autofac注册IHttpContextAccessor

3
我使用autofac的PropertiesAutowired方法(ASP.NET CORE)。 我需要在类库项目中获取当前用户。我该怎么做?我想要像这样的东西
public IHttpContextAccessor ContextAccessor{ get; set; }

最初的回答,然后像这样使用它:
Context.HttpContext.User.Claims.First(i => i.Type == "NameIdentifier"

可以实现,还是需要使用其他工具?最初的回答。

1
你需要确保IHttpContextAccessor已经注册。这不会自动完成。最好避免使用属性注入,而是使用构造函数注入,因为IHttpContextAccessor似乎是一个必需的依赖项。要注册它,只需调用services.AddHttpContextAccessor() - Steven
你能详细解释一下“使用不同的依赖注入和方法”的意思吗? - Steven
无论Autofac是否支持属性注入,都与以下最佳实践无关。最佳实践是仅在极少数情况下使用属性注入。属性注入应仅用于真正可选的依赖项;所有其他依赖项应使用构造函数注入。在同一个类中混合使用构造函数注入和属性注入是有效的。请参考《Dependency Injection Principles, Practices, and Patterns》第4.4章,了解有关属性注入的最佳实践。 - Steven
@Steven,谢谢你的回答和链接。我非常感激。 - user3287801
@Steven,不需要使用内置容器来注册这些类。 - alsami
显示剩余4条评论
1个回答

5

注意: 下面的内容仅在按照此处此处的说明将Autofac注册到ASP.NET Core时有效。

如果不需要使用属性自动连接,建议您执行以下操作:

首先,将依赖项注册为singleton(是的,这没有问题,MS也这样做)

builder.RegisterType<HttpContextAccessor>()
   .As<IHttpContextAccessor>()
   .SingleInstance();

假设你的类名为MyClass,则通过构造函数注入它。
public MyClass(IHttpContextAccessor httpContextAccessor)
{
   ContextAccessor = httpContextAccessor;
}

现在您已经准备好了!我相信您可以使用属性自动连接使其正常工作,但我对这种方法不熟悉。

顺便提一句:

如果您想检索经过身份验证的用户的信息,我听说并且已经阅读过建议编写类似于ApplicationUser的类来封装底层框架逻辑。

我实现了类似的这里,还使用IHttpContextAccessor检索所需的声明+我也将访问器注册到autofac中。唯一的区别是我使用构造函数注入。

希望这可以帮到你!


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接