限制静态类的访问

时间:2011-04-01 06:56:34

标签: c# .net

作为学习过程的一部分,我正在使用.NET中的Remoting编写简单的IM应用程序。截至目前它是简单的控制台应用程序,它的工作原理我期待。考虑下一个功能/功能,我陷入了以下代码所代表的情况:

public static class UserManager {
  public static started { get; private set; }
  private static List<User> users;
  static UserManager() {
    users = List<User>();
    started = true;
  }
  public static addUser(int _userID) {}
  public static activateUser(int _userID) {
    foreach (User u in users) {
      if (u.userID == _userID) {
        u.setActive();
        break;
      }
    }
  }
}

class User {
  public int userID { get; private set; }
  public bool active { get; private set; }
  public User(int _userID) {
    userID = _userID;
  }
  public void setActive() {
    // only UserManager should be allowed to modify user state
  }
}

我想只允许UserManager静态类修改其用户列表的状态。我在考虑“朋友”条款,但据我所知,C#中没有这样的结构。如果调用“object”是UserManager类的话,那么只检查(在User类方法内)是否足够?

我会很感激任何意见/建议,包括那些说“不要像你试图做的那样,更好地使用它......”

PS。我不知道应该选择哪个标题,如果更准确的话,请随意(更有经验的程序员/用户)更改它。

2 个答案:

答案 0 :(得分:1)

您可以将UserManagerUser类放在自己的程序集中,并将API的部分标记为internal(相当于VB的Friend)。这使您可以限制从该程序集外部的访问。

限制访问的另一种方法是执行基于角色的安全性。 .NET有PrincipalPermissionAttribute

public static class UserManager 
{
    [PrincipalPermission(SecurityAction.Demand, 
        Role = "Administrators")]
    public static void AddUser(int userId) { }
}

请注意,这仅在您了解用户角色时才有效,但在用户通常登录的网站(ASP.NET WebForms / MVC)和Web服务(WCF)等场景中尤其有用。 / p>

答案 1 :(得分:0)

我可以想到的唯一选项是在编译时真正限制UserUserManager成员的访问权限:

  • 将其中两个放入自己的程序集中,并使成员内部
  • UserManager中设置User嵌套类,并将成员设为私有

如果您只是将成员设为内部成员,它将限制对程序集的访问 - 您是否可以使程序集足够小以至于您可以信任该程序集中编写的代码?

(就像一个友好的建议,我建议你查看Microsoft .NET命名约定 - 它会让你的代码看起来更像是惯用的C#。)