2011-04-06 12 views
5

La capa de servicios de mi arquitectura está compuesta de muchas clases de comando de propósito único (clases que realizan una función específica en datos, como crear un usuario) y clases de consulta (clases individuales que consultan la base de datos para obtener datos específicos). Estos se inyectan en mis clases de controlador Asp.net MVC a través de los instaladores de Windsor.Cómo puedo hacer que T4 genere código basado en clases en un espacio de nombre específico (Recursivamente)

Por ejemplo, ejecuto container.Register(Component.For<CreateUserCommand>().ImplementedBy<CreateUserCommand>()); en mi clase personalizada IWindsorInstaller para crear instancias del CreateUserCommand en mis controladores.

El problema es que ya que cada clase de comando/consulta es solo propósito, que va a terminar con una gran cantidad de estas clases, y el mantenimiento de mi clase instalador va a ser un dolor en el trasero. Se me ocurrió que este sería un trabajo perfecto para T4, ya que solo puedo ejecutar el T4 y hacer que regenere la clase de instalador para registrar automáticamente todas mis clases de comando y consulta.

Desafortunadamente, como nunca antes había hecho T4, no sé cómo proceder para implementarlo. He leído los conceptos básicos de T4, pero mi principal punto de confusión es cómo encontrar realmente todas mis clases de comando y consulta a través de T4.

En papel, puedo encontrar todas mis clases de comando/consulta porque están definidas en los espacios de nombres MyApp.DomainModel.Commands.* y MyApp.DomainModel.Queries.*. Por ejemplo, la clase CreateUserCommand reside en el espacio de nombres MyApp.DomainModel.Queries.Users. Sin embargo, no tengo idea de cómo hacer para ver los espacios de nombres en tiempo de ejecución, y mucho menos recursivamente.

Es posible para mí para crear una interfaz ICommand y IQuery para estas clases que se basan fuera de si eso es más fácil de encontrar en la T4 de espacios de nombres, pero no sabía cómo iba a encontrar todos ICommand/IQuery subclases desde la T4.

Yo sé la reflexión, pero a partir de la lectura he leído mucho diciendo que el uso de la reflexión en T4 es una mala idea y/o no funciona correctamente.

¡Si alguien pudiera señalarme algo que me ayudaría a lograr esto, lo agradecería enormemente!

Respuesta

8

El uso de la reflexión de T4 no es intrínsecamente malo, pero respecto a "no funciona correctamente", el problema principal es que no se puede reflejar fielmente el ensamblaje actual en el que se define la plantilla T4, ya que aún no se ha compilado . Por lo general, debe dividir su proyecto en diferentes conjuntos para acceder a sus propios tipos desde T4.

Encontrar todos los tipos en un espacio de nombres no es un problema difícil, particularmente si están todos definidos en el mismo ensamblaje.

<#@ import namespace = "System.Reflection" #> 
<# 
var path="D:\Path\To\MyApp.DomainModel.dll"; 
Assembly a = Assembly.ReflectionOnlyLoadFrom(path); 
foreach (var type in a.GetTypes()) { 
    if (type.Namespace == "MyApp.DomainModel.Commands") { #> 
     <#=type.Name #> 
<# } 
} 
#> 
+0

¡Funciona como un encanto, gracias! – KallDrexx

Cuestiones relacionadas