2010-04-13 9 views
7

Ho una classe A con un metodo pubblico in C#. Voglio consentire l'accesso a questo metodo solo alla classe B. È possibile?C'è un modo per limitare l'accesso a un metodo pubblico solo a una classe specifica in C#?

UPDATE:

questo è quello che vorrei fare:

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(); 
    } 
} 

mi piacerebbe altri programmatori da fare:

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

mi piacerebbe assicurati che non chiamino manualmente ProcessInactiveProduct:

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

Desidero consentire l'accesso di Category.ProcessInactiveProduct solo al prodotto di classe. Altre classi non dovrebbero essere in grado di chiamare Category.ProcessInactiveProduct.

+0

+1 Domanda molto interessante. –

+2

Se si desidera solo accedervi dalla classe B, questo non è un metodo "pubblico". – Nate

risposta

18

Posizionare entrambe le classi in un assieme separato e rendere il metodo interno.

+0

+1 Haha! Bella risposta! Potrei aver pensato troppo alla mia risposta :) –

+0

(Commento rimosso ... L'ho letto come assembly separati, come al plurale) –

2

È possibile se si effettua classe A una classe annidata privato all'interno della classe B:

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

Solo B sarà in grado di vedere A ed è membri in questo esempio.

In alternativa si potrebbe nido B all'interno A:

class A 
{ 
    Int32 Foo { get; set; } 

    public class B { } 
} 

In questo caso tutti possono vedere sia A e B ma solo B può vedere A.Foo.

+0

Grazie, ma sono classi separate (non nidificate). Mi piacerebbe nascondere un metodo dalla classe A, ma mostrarlo (permetterlo) a solo 1 certa classe (classe B). A e B non sono nidificati. – Anon

+1

Senza annidare i tipi non sarà possibile farlo utilizzando i costrutti di linguaggio predefiniti. Potrebbe essere necessario prendere in considerazione un approccio basato sulla sicurezza (consentire l'accesso solo se un tipo "autentica"), ma ritengo che la necessità di ciò possa tradire un difetto nella progettazione. Qual è l'immagine più grande? Forse se modifichi il tuo post con maggiori dettagli posso aiutarti a trovare una soluzione :) –

+0

Andrew, ho aggiornato la domanda. – Anon

0

Non c'è una risposta pronta per la tua domanda.

Se sono già nello stesso assembly, perché non rendere il metodo interno ambito invece?

Se si trovano in diversi gruppi, è possibile utilizzare la sintassi "friend" che copre tutti i metodi interni.

Probabilmente la soluzione migliore è limitare l'accesso ai metodi pubblici a specifici assembly. Ciò significa che qualcuno non può semplicemente scrivere un nuovo assembly e andare avanti a chiamare i tuoi metodi pubblici. Dato che sembra che tu abbia un modello di dominio, sembra che dovresti consentire a questo metodo di essere chiamato da altri oggetti di dominio, ma forse non dalla logica aziendale. Questo può essere ottenuto assegnando un nome sicuro univoco alle DLL del modello di dominio.

È possibile limitare l'accesso a un metodo pubblico per consentirne il richiamo solo mediante metodi in assiemi che soddisfano una determinata chiave pubblica. vedi msdn StrongNameIdentityPermission

0

È possibile utilizzare un tipo di pattern Observer, in cui la categoria registra un interesse per eventi particolari sul prodotto (forse un evento ProductInactivated?) e quindi gestisce la logica in modo appropriato. Questo pattern basato sugli eventi è molto comune e riduce notevolmente l'accoppiamento. La Categoria è in ultima analisi responsabile del proprio stato e non si affida al Prodotto sapendo qualcosa su cosa lo contiene al fine di mantenere intatto lo stato della Categoria.Il prodotto dice solo ai clienti interessati quando le cose sono accadute.

Un'altra opzione è quella di refactoring della classe Category in modo che contenga o sia contenuta da qualche oggetto CategoryProductServices che incapsula i metodi che un Prodotto dovrebbe eseguire sulla sua categoria contenente. Nel contesto che crea le categorie e i prodotti, passare l'istanza di questo oggetto CategoryProductServices al prodotto anziché all'intera categoria. Questo design mantiene l'interfaccia pubblica, ma impedisce al client di accedere ai servizi, in quanto non è possibile recuperare un'istanza. Inoltre, allenta lo stretto accoppiamento dei prodotti alla classe Category, limitandola solo ai servizi di cui i prodotti devono essere a conoscenza. Ciò lascia il prodotto responsabile dello stato, ma limita almeno ciò che è necessario sapere/fare.

1

È possibile limitare l'accesso metodo/classe in questo modo:

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

dare uno sguardo qui http://msdn.microsoft.com/en-us/library/c09d4x9t.aspx per maggiori informazioni.

codice gestito offre diversi modi per limitano metodo accesso:
...

  • Limita il metodo di accesso ai chiamanti di un'identità specifica - in sostanza, le prove particolari (forte nome, editore, zona e così via) che scegli.
Problemi correlati