2010-04-13 89 views
7

我有一個在C#中使用公共方法的類A.我想允許訪問這個方法只有類B.這是可能的嗎?有沒有辦法限制只有在C#中的特定類的公共方法的訪問?

UPDATE

這是我想做什麼:

public class Category 
{ 
    public int NumberOfInactiveProducts {get;} 
    public IList<Product> Products {get;set;} 

    public void ProcessInactiveProduct() 
    { 
     // do things... 

     NumberOfInactiveProducts++; 
    } 
} 

public class Product 
{ 
    public bool Inactive {get;} 
    public Category Category {get;set;} 

    public void SetInactive() 
    { 
     this.Inactive= true; 
     Category.ProcessInactiveProduct(); 
    } 
} 

我想其他的程序員做的事:

var prod = Repository.Get<Product>(id); 
prod.SetInactive(); 

我想確保他們不要手動調用ProcessInactiveProduct:

var prod = Repository.Get<Product>(id); 
prod.SetInactive(); 
prod.Category.ProcessInactiveProduct(); 

我想允許Category.ProcessInactiveProduct只訪問Product類。其他類不應該能夠調用Category.ProcessInactiveProduct。

+0

+1非常有趣的問題。 – 2010-04-13 13:54:12

+2

如果您只希望它通過B類訪問 - 那麼這不是一個「公共」方法。 – Nate 2010-04-13 13:58:19

回答

18

將這兩個類放在一個單獨的程序集中並使該方法成爲內部方法。

+0

+1哈哈!很好的答案!我可能已經超出我的回答了一下:) – 2010-04-13 13:57:32

+0

(評論刪除...我讀它作爲單獨的程序集,如複數) – 2010-04-13 14:06:00

2

你可以,如果你讓類AB類私人,嵌套類:

class B 
{ 
    class A 
    { 
     public Int32 Foo { get; set; } 
    } 
} 

只有B就能看到A和它在這個例子中的成員。

另外,您可以窩BA

class A 
{ 
    Int32 Foo { get; set; } 

    public class B { } 
} 

在這種情況下,每個人都可以看到兩個AB但只有B可以看到A.Foo

+0

謝謝,但它們是分開的(不是嵌套的)類。我想隱藏A類的一個方法,但只顯示它(允許它)只有一個類(B類)。 A和B不是嵌套的。 – Anon 2010-04-13 13:50:09

+1

如果沒有嵌套類型,您將無法使用默認語言構造來完成此操作。您可能不得不考慮基於安全的方法(只有在類型「認證」時才允許訪問),但我相信您對此的需求可能會在您的設計中出現缺陷。什麼是更大的圖片?也許如果你編輯你的文章更多的細節,我可以幫你找到解決方案:) – 2010-04-13 13:52:32

+0

安德魯,我已經更新了這個問題。 – Anon 2010-04-13 14:14:31

0

對於您的問題,沒有開箱即用的答案。

如果它們已經在同一個程序集中,爲什麼不改用內部作用域?

如果它們在不同的程序集中,則可以使用涵蓋所有內部方法的「friend」語法。

也許你最好的解決方案是限制對特定裝配的公共方法的訪問。這意味着某人不能只寫一個新的程序集並繼續打電話給你的公共方法。鑑於你似乎有一個領域模型,它看起來應該允許從其他領域對象調用此方法,但可能不是從業務邏輯中調用。這可以通過爲域模型DLL分配一個唯一的強名稱來實現。

您可以限制對公共方法的訪問權限,只允許它通過滿足給定公共密鑰的程序集中的方法進行調用。請參閱msdn StrongNameIdentityPermission

0

您可以使用Observer類型的模式,其中類別在產品上註冊特定事件的興趣(可能是ProductInactivated事件?),然後適當地處理邏輯。這種基於事件的模式非常普遍,大大減少了耦合。該類別最終對其自己的國家負責,並且不依賴產品知道包含它的內容,以便保持類別的狀態不變。產品只是告訴感興趣的客戶當事情發生時。

另一種選擇是重構您的Category類,使其包含或包含在某個CategoryProductServices對象中,該對象封裝了產品需要在其包含的類別上執行的方法。在創建類別和產品的上下文中,將此CategoryProductServices對象的實例傳遞給產品而不是完整的類別。這種設計使接口保持公開,但阻止你的客戶訪問服務,因爲他們無法檢索實例。它還放鬆了產品與Category類的緊密耦合,將其僅限於產品必須注意的那些服務。這使產品負責該州,但至少限制了它需要知道/做的事情。

1

可以限制方法/類的訪問中這樣說:

[StrongNameIdentityPermissionAttribute(SecurityAction.Demand, PublicKey="…hex…", Name="App1", Version="0.0.0.0")] 
public class Class1 { } 

看看這裏http://msdn.microsoft.com/en-us/library/c09d4x9t.aspx獲取更多信息。

託管代碼提供了幾種方法來限制方法訪問
...

  • 限於特定身份的呼叫者的方法訪問 - 本質上,任何特定的證據(強名稱,發佈者,區域等)。
相關問題