簡體   English   中英

限制對靜態類的訪問

[英]Restricting access for static class

作為學習過程的一部分,我正在使用.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#中沒有這樣的構造。 僅檢查(在User類方法中)是否足夠,調用“對象”是否屬於UserManager類?

我將不勝感激任何輸入/建議,包括那些說“不要像您嘗試做的那樣做,最好使用它。”

PS。 不知道應該選擇哪個標題,如果更准確,可以隨意(經驗豐富的程序員/使用者)隨意更改。

您可以將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)等方案中特別有用。

我能想到的真正限制對成員訪問的唯一選擇UserUserManager在編譯時有:

  • 將他們兩個放在自己的程序集中,並使成員內部
  • UserManagerUser的嵌套類,並將成員設為私有

如果僅將成員設置為內部成員,則無論如何都會限制對程序集的訪問-是否不能使程序集足夠小以至於不能信任該程序集內編寫的代碼?

(只是一些友好的建議,我建議您查找Microsoft .NET命名約定-它會使您的代碼看起來更像慣用的C#。)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM