2009-11-05 25 views
2

我正在尋找一種方法來創建某種值類型的分層類結構。我知道枚舉不支持繼承,因爲它們是值類型,因此是封閉的,所以我可能正在尋找某種靜態類實現。C模擬值類型多態性夏普

我的目的是重新定義我正在處理的這個ASP.NET應用程序中的角色。目前,這些角色是字符串常量(ROLE_ADMIN,ROLE_USER等),並放置在會話中並在整個應用程序中進行檢查,如下所示:Person.getRole()== ROLE_ADMIN(實際上是字符串比較)。我想對此進行重構,以便我可以具有類型安全性,以及下面描述的某種多態行爲。

考慮以下角色結構:如果一個人的角色設置到Group1,但頁面上的某個元素只有通過用戶1可見

   user1 
     Group1 
      user2 
Admin 
     User3 

,那麼我想聲明Person.getRole()= = user1爲true。

編輯:

上述結構爲樹的思考,我希望能夠以無論是在葉或節點來定義在葉或節點,並且檢查權限方面的用戶。然而,這引起了困境,根據節點檢查權限是否檢查用戶是屬於組(group1)還是屬於組(Admin)。 我認爲問題在於,將我的樹的根節點命名爲'Admin'是誤導性的,因爲節點應該被認爲是組而不是角色本身。根節點應該是'All',當它被定義爲'All'時,它將繼承樹的所有樹葉,因此屬於所有組。

+0

我要去把我的損失,並放棄這一問題現在。爲了將來的參考,我標出了我認爲最合適的答案。不幸的是,這種改變沒有任何商業原因,並且開始花費太多時間來完成。 – 2009-11-09 14:21:19

回答

1

我不知道什麼值類型與此有關(字符串是一個引用類型)。這裏常見的方法是使用IPrincipal.IsInRole或類似的東西。

您的'等級'問題將轉移到角色填充部分。

+0

我想我正在尋找不改變狀態的對象,只是簡單地表示一個'值',所以我將它與值類型相關聯。其他人也提到了我忘記的不可變對象。 我不知道.NET中的Principal和Identity結構,我會研究它。 – 2009-11-06 13:13:57

+0

這個解決方案本身並沒有實現類型安全,所以我不得不尋找包裝主體/身份系統以使用枚舉的選項。我知道有方法來來回轉換字符串和枚舉。 我也想以這種方式包裝它,我不必執行像Principal.IsInRole('user1')||等檢查。 Principal.IsInRole('user2')確定它們是否在group1中。 – 2009-11-06 15:39:11

+0

用法更像'currentPrinicpal.IsInRole(「group1」)' – 2009-11-06 18:16:58

0

我猜測用戶必須登錄嗎?所以當他們登錄時,爲什麼不給用戶添加一個用戶對象?

// Object to represent a user 
public class SiteUser 
{ 
    public String Name { get; set; } 
    public UserTypes UserType { get; set; } 
} 

// Enumeration of user types 
public enum UserTypes : int 
{ 
    Admin = 1, 
    General = 2 
} 

public partial class Home : System.Web.UI.Page 
{  
    private void Login() 
    { 
     // Login method here, take username password etc... 
     // This is for example purposes... 
     SiteUser user = new SiteUser(); 

     user.UserType = UserTypes.Admin; 
     user.Name = "Bob"; 

     Session["User"] = user; 
    } 
} 

public partial class AdminOnlyPage : System.Web.UI.Page 
{  
    private void Page_Load(object sender, EventArgs e) 
    { 
     // On pages where we want to know the user details 
     // cast the session user object back to our SiteUser object. 
     SiteUser user = Session["User"] as SiteUser; 

     // This page is admin only, if our user in session isn't an admin 
     // then redirect them else where... 
     if (user.UserType != UserTypes.Admin) 
     { 
      Response.Redirect("/LoginPage.aspx"); 
     } 
    } 
} 
+0

對不起,我沒有指定,用戶不必登錄,有一個Web服務提供憑據,應用程序將該狀態放入會話中。 該解決方案通過使用枚舉來解決類型安全問題,但分層問題仍未解決。我不想將ADMIN定義爲自己的角色,而是將其他角色集合在一起。參考我的例子,我只會檢查代碼中樹葉中的葉子角色,並且樹中的節點將被允許,這是基於子樹中樹葉中包含的角色。 – 2009-11-06 13:18:25

0

用對象模擬值類型語義的一種方法是不可變對象。如果這是一個陌生的概念,那麼簡短的版本是「構造後它們不會改變狀態」,它不是任何設置者,也不是公有領域(但是他們會以任何方式做這樣一個愚蠢的事情; p),也沒有副作用的方法。

埃裏克利珀寫的文章,很不錯的意甲不變性的概念: immutability part one

+0

我忘記了不可變對象。我會進一步研究。 – 2009-11-06 13:18:57