AutoFac:注入 NULL 值

2023-11-23

我想使用 AutoFac 将当前主体注入需要它的对象中。假设我有一个对象(AuthorizationValidator)正在执行安全检查。它看起来像这样:

public AuthorizationValidator : IAuthorizationValidator
{
  public AuthorizationValidator(IDataAccess dataAccess, IPrincipal principal)
  {
     // Save injected objects
     ...
  }

  public bool CheckPermission(Guid objectId, Action action)
  {
     // Check if we are authorized at all
     if (this.principal == null)
       return false;

     // Check the permission in the database
     ...
  }
}

对于我的 Web 应用程序,授权验证器已注册,我使用以下注册来注入主体:

builder.Register<IPrincipal>((c, p) => HttpContext.Current?.User);

其他类型的应用程序使用线程的主体或类似的东西。所有需要主体的对象都会注入正确的主体。

如果未经授权进行调用,则 AutoFac 会引发异常,告诉我它无法提供IPrincipal对象,因为工厂返回了null。在这种情况下,空主体就可以,不应该引发异常。


在 Autofac文档他们建议使用空对象模式对于这样的场景。你可以创建一个NullPrincipal继承自的类IPrincipal具有私有构造函数的接口,该构造函数仅公开readonly static提供默认实例的字段。然后你可以返回这个实例而不是 null:

builder.Register<IPrincipal>((c, p) => HttpContext.Current?.User ?? NullPrincipal.Default);

当然,您必须更新代码中检查主体是否为空并检查它是否等于NullPrincipal.Default反而。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

AutoFac:注入 NULL 值 的相关文章