2012-09-20 20 views
5

Estoy seguro de que este es un requisito muy extraño, pero aquí va.¿Cómo puedo generar una clase C# descargable desde un sitio web ASP.NET MVC?

Tenemos un código de configuración de cliente que se representa mediante clases de C# que compilamos en una biblioteca de clases. La creación de estas clases de configuración actualmente es un trabajo de mono que me gustaría asignar a alguien que no sea un desarrollador. Por lo tanto, estamos construyendo un sitio web "Configurador" que un analista de negocios puede usar para generar clases de C# válidas completando un formulario con las opciones relevantes seleccionadas.

¿Cuál es la mejor forma de generar una clase C# a partir de una plantilla en un sitio web de MVC? Tenga en cuenta que no estoy hablando aquí de generar dinámicamente y ejecutar una clase en tiempo de ejecución: básicamente estamos generando un archivo de texto que contiene código C# que se incluirá en un proyecto totalmente diferente.

¡Está resultando ser un tema muy difícil de googlear correctamente! Las opciones que han llegado hasta ahora ...

  • sólo tiene que utilizar un archivo de texto con token y reemplazar los valores usando String.Format
  • alguna manera usar la maquinilla de afeitar como un motor de plantillas (pero no sabe cómo, y no es que html 'generación re)
  • alguna manera utilizar plantillas T4 (al menos sé que se utiliza para generar C#, pero no está seguro de cómo ejecutar en tiempo de ejecución)

alguna idea sobre la mejor manera de abordar esto?

Según lo solicitado, aquí hay un ejemplo de la clase/archivo de salida. Los valores aquí anulan los valores establecidos en una clase base con etiquetas, validación específicas del cliente, etc. Así es como personalizamos nuestro producto para los clientes.

public class AreaRiskTemplate: AreaRiskTemplateBase 
{ 
    public override string EntityName { get { return "risk"; } } 
    public override string EntityNamePlural { get { return "risks"; } } 
    public override string EntityNameArticle { get { return "a"; } } 
    public override string CGovItemRefPrefix { get { return "R"; } } 
    public override void SetFieldDefinitions() 
    { 

     FieldDefinitions.Level1.IsImplemented = true; 
     FieldDefinitions.Level1.Label = "Category"; 
     FieldDefinitions.Level1.IsVisibleInGrid = true; 

     FieldDefinitions.Level2.IsImplemented = true; 
     FieldDefinitions.Level2.Label = "Team"; 
     FieldDefinitions.Level2.IsVisibleInGrid = true; 

     FieldDefinitions.Description.IsImplemented = true; 
     FieldDefinitions.Description.Label = "Description"; 
     FieldDefinitions.Description.IsVisibleInGrid = true; 

    } 
    public override ModelStateDictionary Validate() 
    { 
     var msd = new ModelStateDictionary(); 
     // add template-specific validation here 
     msd.Merge(base.Validate()); 
     return msd; 
    } 
    public override List<string> Level1Options 
    { 
     get 
     { 
      return new List<string> 
       { 
        "Organisational", 
        "Financial", 
        "Operational", 
        "External", 
      "IT" 
       }; 
     } 
    } 
} 

Actualizar: actualmente investigando las plantillas T4 en http://msdn.microsoft.com/en-us/library/ee844259(v=vs.100).aspx (gracias a los comentarios más abajo). Parece prometedor.

+1

http://msdn.microsoft.com/en-us/library/bb126445.aspx parece incluir detalles sobre cómo empezar con T4 en tiempo de ejecución. –

+0

Esto también podría ser de interés: http://code.msdn.microsoft.com/windowsdesktop/Single-File-Generator-94d856d4 – Magrangs

+0

¿Puede publicar un ejemplo de cómo se ve este archivo de configuración? –

Respuesta

1

Sugiero evitar el sitio web, y en su lugar simplemente ir con CodeSmith. Puede diseñar scripts de CodeSmith para que le pidan información y luego generen el código requerido. Parece mucho menos trabajo, aunque tienes que comprar CodeSmith.

+0

Gracias por la sugerencia. He usado Codesmith bastante en el pasado. Supongo que mi problema es que, en este caso, quiero que personas no técnicas ingresen los datos que permiten la generación de las clases. El desarrollador entonces iniciaría sesión y descargaría clases basadas en esa información. Es muy posible que el alcance de Codesmith haya cambiado en los más de 5 años desde la última vez que jugué con él, pero creo que falta esa interfaz de entrada. – centralscru

+1

@centralscru - CodeSmith le permite crear un cuadro de diálogo que acepta los parámetros que se usan en la generación. El usuario final solo ejecuta el script, rellena los cuadros y hace clic en Aceptar. Luego puede guardar esas clases generadas en un recurso compartido de UNC. –

0

El método para hacer esto con la menor sobrecarga sería usar Microsoft incorporado en CodeDOM API. Le permite compilar y manipular documentos de códigos CLR con un Modelo de Objetos de Documentos compatible con varios idiomas.

El único inconveniente de este enfoque es que no es inmediatamente obvio cómo implementar algunas características específicas del idioma. Un ejemplo son los campos C# readonly, porque no están disponibles en todos los lenguajes CLR, sino solo en C#. La solución para esta intrincación particular es usar CodeSnippet e insertar el código manual como una cadena. Otros problemas de desajuste más complejos pueden mitigarse integrando el CodeDOM con un motor de plantillas. Oleg Sych escribió a useful article on integrating CodeDOM with the T4 templating engine. Prefiero este tipo de enfoque a un enfoque de generación de texto puro, porque un modelo de objeto de documento fuertemente tipado es menos propenso a errores que el texto puro.

Además, si alguna vez hace el cambio para querer que se compile el código de salida, esto también es compatible con la API CodeDOM.

Si esta es una práctica que crees que puedes usar mucho, puedes envolver algunas funcionalidades comunes de manipulación DOM en llamadas a métodos fluidos usando el builder pattern. Construí una biblioteca personal que utiliza este enfoque y ha tenido mucho éxito en aumentar mi productividad mediante la generación de código.

Cuestiones relacionadas