业务对象或单独处理程序中的授权代码?

Authorization code in business object or separate handler?

我有一个包含 ACL 项集合的业务对象,我正在尝试决定是否将授权代码放入业务对象中,如下所示:

class Foo()
{
  public IEnumerable<Permission> Permissions { get; set; }
  public bool HasPermission(string username, FooOperation operation) 
  { 
    // check this Foo's Permissions collection and return the result
  }
}

class FooHandler()
{
  public void SomeOperation(Foo foo)
  {
    if(foo.HasPermission(username, FooPermission.SomeOperation))
    {
      // do some operation
    }
  }
}

或者像这样在对象处理程序中:

class Foo()
{
  public IEnumerable<Permission> Permissions { get; set; }
}

class FooHandler()
{
  public void SomeOperation(Foo foo)
  {
    if(SecurityManager.HasPermission(foo, username, FooPermission.SomeOperation))
    {
      // do some operation
    }
  }
}

class SecurityManager
{
  public HasPermission(Foo foo, string username, FooPermission operation)
  {
    // check foo's Permissions collection and return the result
  }
}

每种方法的优缺点是什么? 请记住,在任何一种情况下,权限收集都将是 public b/c 我正在使用Entity Framework 在我的数据层中直接保留业务对象(如有必要,我愿意在以后进行更改)。

第二种方法最接近 MVC 控制器结构:) 但对于你的问题,最好的做法是将授权与业务逻辑分开,你可以将访问管理作为一个单独的方法来实现,并在你需要检查访问权限的任何地方调用。这非常等同于 MVC 控制器中的授权过滤器。

补充说明: 我想从业务对象中删除 ACL 集合并从 SecurityManager class 的存储库中检索它们。