2010-09-27 15 views
15

¿Es posible tener una sola clase resida dentro de dos espacios de nombres y cómo puedo hacer esto?.NET Múltiples espacios de nombres para la clase simple

Para aclarar: Tenemos una biblioteca de clases (supongamos que el espacio de nombres raíz es classLib1), que ha crecido con el tiempo (más clases) y quiero agrupar lógicamente las clases en espacios de nombres diferentes. Sin embargo, algunas de las clases más antiguas deben agruparse en estos nuevos espacios de nombres (por ejemplo, classLib1.section1) y al hacerlo se romperá el código heredado en otros ensambles que usen esta biblioteca de clases. Así que quiero poder referirme a una clase usando ambos espacios de nombres hasta que podamos eliminar los anteriores.

No encuentro ninguna información al respecto, lo que sugiere que hay una razón por la que la gente no querría hacer esto.

+1

¿Por qué no simplemente refactorizar correctamente y corregir las referencias en los ensamblajes heredados? –

+0

Quiero, pero no estoy autorizado a tocar el otro código - mucho está en la línea si se comete un error. –

+1

Entonces las fachadas son tus amigos. – annakata

Respuesta

20

No, no hay forma de asignar a una sola clase dos nombres (el espacio de nombres es solo una parte del nombre de la clase).

Como solución alternativa, puede mover las clases a su nueva ubicación y crear envoltorios delgados alrededor de ellas en la ubicación anterior (Patrón de fachada). Una mejor solución, por supuesto, sería mover las clases y corregir el código heredado en consecuencia.

+0

... sugeriría por qué no puedo encontrar información sobre esto - ¿esto tiene que ver con cómo los nombres compilan espacios para CLR? –

+0

Maldito seas, golpéame :) – annakata

+0

Había pensado en crear una capa de fachada, pero estaba viendo si había un trabajo más fácil. –

4

Como solución se puede 'utilizar' la clase en el segundo espacio de nombres cuando lo necesite:

namespace classLib1.section2 
{ 
    public myBigClass 
    { 

y en todos los archivos que lo utiliza en el antiguo espacio de nombres se puede añadir una línea

namespace classLib1.section1 
{ 
    using myBigClass = classLib1.section2.myBigClass; 

como un parche temporal hasta que haya solucionado esto correctamente.

+0

Esto probablemente no funcione con clases estáticas (extensiones). Quiero decir, lo probé, pero no pude acceder a ninguno de los métodos de extensión. También tuve que agregar una clase ficticia al espacio de nombres para que sea visible para el resto de la aplicación. – jahu

3

Type Forwarding se introdujo en .net 2.0, lo que significa que puede usar el atributo TypeForwardedToAttribute para indicar que un tipo que originalmente estaba presente en AssemblyX ahora se encuentra en AssemblyY.

Estoy bastante seguro de que esto solo es apropiado/aplicable si se está separando en varios conjuntos, pero vale la pena saberlo aunque no sea así.

Cuestiones relacionadas