gpt4 book ai didi

c# - 配置 Simple Injector 以注入(inject)当前经过身份验证的用户

转载 作者:太空狗 更新时间:2023-10-29 22:36:21 25 4
gpt4 key购买 nike

我有一个类需要根据当前经过身份验证的用户在构造时设置一个 IPrinciple 对象。

我发现了一些我试过但没有用的其他代码:

private readonly Lazy<IPrincipal> _principal;

public MyService(Lazy<IPrincipal> principal)
{
_principal = principal;
}

然后我像这样配置了 Simple Injector:

container.Register(() => new Lazy<IPrincipal>(() => HttpContext.Current.User));

当我尝试运行它时,显然 _principal 未定义/未设置为对象的实例。

我也试过:

container.Register(() => new Lazy<IPrincipal>(() => Thread.CurrentPrincipal));

这让我可以检查 _principal.Value.Identity.IsAuthenticated 但总是返回 false

最佳答案

问题的根源是您在构建对象图期间将运行时数据注入(inject)组件。正如解释的那样 here , 这是个坏主意。

相反,正如引用文章所建议的那样,您应该延迟请求此运行时数据的决定,直到构建图形之后;在该运行时数据可用时。

您可以通过创建自定义 IPrincipal 来做到这一点像这样实现:

public class HttpContextPrinciple : IPrincipal
{
public IIdentity Identity => HttpContext.Current.User.Identity;
public bool IsInRole(string role) => HttpContext.Current.User.IsInRole(role);
}

然后这样注册:

container.RegisterSingleton<IPrincipal>(new HttpContextPrinciple());

这允许您注入(inject) IPrincipal直接进入消费者喜欢 MyService .这简化了消费者,因为他们不必处理 leaky abstractions例如Lazy<T> .

关于c# - 配置 Simple Injector 以注入(inject)当前经过身份验证的用户,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37440726/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com