2010-11-23 15 views
5

Tengo una clase que estoy usando como descriptor para un objeto. En ese descriptor, hay varias referencias Type para las clases que se van a instanciar para diferentes operaciones que involucran ese objeto. Estaba pensando en sacar esas referencias y reemplazarlas con atributos en la clase de descriptor.¿Uso de atributos no autorizado/inapropiado?

De esta:

class MyDescriptor : BaseDescriptor { 
    public Type Op1Type { get; } 
    public Type Op2Type { get; } 
} 

A esto:

[Op1(typeof(foo))] 
[Op2(typeof(bar))] 
class MyDescriptor : BaseDescriptor { 
} 

utilizo atributos muy raramente. ¿Esto se consideraría un mal uso de ellos?

+0

¿Ha pensado en usar genéricos en su lugar? – Lazarus

+0

un problema es que está cumpliendo con el requisito de conocer el tipo en tiempo de compilación en la interfaz pública si usa atributos. El uso de métodos virtuales permite el uso de tipos desconocidos en tiempo de compilación. – CodesInChaos

+0

Las clases derivadas pueden tener diferentes números de operaciones, por lo que no podría tener un número estático de parámetros genéricos. – redman

Respuesta

0

Creo que este es un buen uso de los atributos, especialmente si desea poder instanciar las clases de decoración a través de la reflexión antes de instaurar la clase que decoran. El uso de atributos tiene muchos beneficios, y este es solo uno.

Independientemente de su intención, no veo ningún problema con la implementación.

+0

DI todavía es mucho mejor para hacer esto. – Aliostad

0

me gustaría utilizar personalmente inyección de dependencias en lugar de la cocción de la dependencia en el propio tipo en tiempo de compilación .

No veo ningún beneficio que pueda obtener al hacer esto al instanciar las dependencias por la clase en su constructor o inicializar.

Dependency Injection le permite cambiar dicho comportamiento en el tiempo de ejecución, además de la posibilidad de reemplazarlos por stubs/mocks.

+0

Soy bastante nuevo en DI, solo he estado expuesto a él en mi trabajo más reciente. No me siento lo suficientemente cómodo para tratar de implementarlo en este caso, pero utilizaré su sugerencia como un punto de partida para algunas investigaciones sobre el tema. – redman

+0

Esto es más o menos lo que estás buscando. Use Unity, Castle, StructureMap o cualquier otro y muy fácil de implementar. – Aliostad

0

No veo ningún problema en la forma en que usó los atributos, pero tampoco veo ningún beneficio que haya obtenido. Quizás si compartes más información sería más fácil encontrar una solución.

+0

Es cierto, no hay beneficio tangible desde el punto de vista de la codificación. El beneficio que espero lograr es desde el punto de vista de la convención. – redman

0

Lo uso de esta forma cuando quiero especificar qué tipo de, por ejemplo, proveedor de algoritmo hash usar.

La clase secundaria tiene el atributo que leerá la clase principal y creará una instancia de ese tipo.

0

Los atributos son una forma bastante elegante de expresar esto en código fuente, pero miserable rendimiento en tiempo de ejecución.

Querrá construir un caché en tiempo de ejecución para hacer búsquedas rápidamente, quizás usando Dictionary<Type, Type>.

Cuestiones relacionadas