代码之家  ›  专栏  ›  技术社区  ›  Shahar Shokrani

如何在ContainerBuilder中允许Null作为默认值[[副本]

  •  0
  • Shahar Shokrani  · 技术社区  · 6 年前

    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应用程序,AuthorizationValidator已注册,我使用以下注册来注入主体:

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

    如果调用未经授权,那么AutoFac会引发异常,告诉我它无法提供 IPrincipal null . 在这种情况下,空的主体就可以了,不应该引发异常。

    0 回复  |  直到 8 年前
        1
  •  10
  •   fknx    8 年前

    在Autofac中 documentation Null Object pattern 对于这种情况。你可以创造一个 NullPrincipal IPrincipal 与只公开 readonly static

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

    当然,您必须更新代码中检查主体是否为null以及是否等于 NullPrincipal.Default 相反。

        2
  •  3
  •   Ramon de Klein    8 年前

    为了解决这个问题,我创建了 IPrincipalFactory 无需通过AutoFac即可获得当前主体的接口:

    public AuthorizationValidator : IAuthorizationValidator
    {
      public AuthorizationValidator(IDataAccess dataAccess, IPrincipalFactory principalFactory)
      {
         // Save injected objects
         _dataAccess = dataAccess;
         _principal = principalFactory.GetCurrentPrincipal();
      }
    
      public bool CheckPermission(Guid objectId, Action action)
      {
         // Same as previous example
         ...
      }
    }
    
    public interface IPrincipalFactory
    {
      IPrincipal GetCurrentPrincipal();
    }
    

    public class IAspNetPrincipalFactory : IPrincipalFactory
    {
      public IPrincipal GetCurrentPrincipal() => HttpContext.Current?.User;
    }
    

    虽然这是可行的,但我并不完全满意这个解决方案。