2010-04-13 22 views
7

Tengo una clase A con un método público en C#. Quiero permitir el acceso a este método solo a la clase B. ¿Es esto posible?¿Hay alguna manera de restringir el acceso a un método público a solo una clase específica en C#?

ACTUALIZACIÓN:

Esto es lo que me gustaría hacer:

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

me gustaría que otros programadores que hacer:

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

me gustaría asegúrese de que no llaman manualmente a ProcessInactiveProduct:

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

Quiero permitir el acceso de Category.ProcessInactiveProduct solo a la clase Product. Otras clases no deberían poder llamar a Category.ProcessInactiveProduct.

+0

+1 Pregunta muy interesante. –

+2

Si solo desea que acceda a la clase B, este no es un método "público". – Nate

Respuesta

18

Coloque ambas clases en un ensamblaje por separado y haga que el método sea interno.

+0

+1 ¡Haha! ¡Buena respuesta! Es posible que haya pensado demasiado mi respuesta :) –

+0

(Comentario eliminado ... Lo leí como asambleas separadas, como en plural) –

2

Usted puede si usted hace una clase A, clase anidada privado dentro de la clase B:

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

Sólo B se podrá ver A y es de miembros en este ejemplo.

otra posibilidad es B nido dentro A:

class A 
{ 
    Int32 Foo { get; set; } 

    public class B { } 
} 

En este caso, todo el mundo puede ver tanto A y B pero sólo B puede ver A.Foo.

+0

Gracias, pero son clases separadas (no anidadas). Me gustaría esconder un método de la clase A, pero mostrarlo (permitirlo) a solo 1 clase determinada (clase B). A y B no están anidados. – Anon

+1

Sin anidar los tipos, no podrá hacer esto utilizando construcciones de lenguaje predeterminadas. Es posible que tenga que considerar un enfoque basado en la seguridad (solo permita el acceso si un tipo "se autentica"), pero creo que su necesidad puede revelar un defecto en su diseño. ¿Cuál es la imagen más grande? Tal vez si editas tu publicación con más detalles puedo ayudarte a encontrar una solución :) –

+0

Andrew, he actualizado la pregunta. – Anon

0

No hay respuesta de fábrica para su pregunta.

Si ya están en el mismo conjunto, ¿por qué no hacer que el método tenga un alcance interno?

Si están en ensamblajes diferentes, puede usar la sintaxis "friend" que cubre todos los métodos internos.

Probablemente su mejor solución es limitar el acceso a los métodos públicos a un (os) ensamblado (s) específico (s). Lo que significa que alguien no puede simplemente escribir una nueva asamblea y seguir adelante y llamar a sus métodos públicos. Dado que parece tener un modelo de dominio, parece que debería permitir que este método sea llamado desde otros objetos de dominio, pero quizás no desde la lógica de negocios. Esto se puede lograr asignando un nombre fuerte exclusivo a los DLL de modelo de dominio.

Puede restringir el acceso a un método público para permitir que solo sea invocado por métodos en ensambles que satisfagan una clave pública determinada. ver msdn StrongNameIdentityPermission

0

Puede usar un tipo de patrón Observer, donde la Categoría registra un interés en eventos particulares en el Producto (¿tal vez un evento ProductInactivated?) y luego maneja la lógica apropiadamente. Este patrón basado en eventos es muy común y reduce en gran medida el acoplamiento. La Categoría es en última instancia responsable de su propio estado y no confía en que el Producto sepa algo sobre lo que lo contiene para mantener intacto el estado de la Categoría.El Producto simplemente le dice a los clientes interesados ​​cuando las cosas le han sucedido.

Otra opción es refactorizar su clase de Categoría para que contenga o esté contenida en algún objeto de CategoryProductServices que encapsula los métodos que un Producto debería realizar en su Categoría que lo contiene. En el contexto que crea las Categorías y Productos, pase la instancia de este objeto CategoryProductServices al Producto en lugar de la Categoría completa. Este diseño mantiene la interfaz pública, pero evita que su cliente tenga acceso a los servicios, ya que no pueden recuperar una instancia. También afloja el estrecho acoplamiento de Productos a la clase Categoría, limitándolo a aquellos servicios que los Productos deben conocer. Esto deja al Producto a cargo del estado, pero al menos limita lo que necesita saber/hacer.

1

Puede restringir el acceso método/clase de esta manera:

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

Echa un vistazo aquí http://msdn.microsoft.com/en-us/library/c09d4x9t.aspx para obtener más información.

El código administrado ofrece varias maneras de restringen el acceso método :
...

  • Limitar el método de acceso a las personas que llaman de una identidad especificada - esencialmente, ninguna evidencia concreta (fuerte nombre, editor, zona, etc.) que elija.
Cuestiones relacionadas