【问题标题】:Configure Simple Injector to inject current authenticated user配置 Simple Injector 以注入当前经过身份验证的用户
【发布时间】:2016-05-25 14:51:34
【问题描述】:

我有一个类需要在构造时根据当前经过身份验证的用户设置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

【问题讨论】:

    标签: c# .net asp.net-mvc dependency-injection simple-injector


    【解决方案1】:

    问题的根源在于您在对象图构建期间将运行时数据注入到组件中。正如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());
    

    这允许您将IPrincipal 直接注入MyService 等消费者。这简化了消费者,因为他们不必处理leaky abstractions,例如Lazy&lt;T&gt;

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2020-12-22
      • 1970-01-01
      • 1970-01-01
      • 2015-10-28
      • 2014-12-20
      • 2020-11-01
      • 1970-01-01
      相关资源
      最近更新 更多