2012-09-20 10 views
5

Sono sicuro che questo è un requisito molto strano, ma qui va.Come posso generare una classe C# scaricabile da un sito Web ASP.NET MVC?

Abbiamo un codice di configurazione del cliente rappresentato dalle classi C# che compiliamo in una libreria di classi. La creazione di queste classi di configurazione è attualmente un lavoro sulle scimmie che vorrei assegnare a qualcuno che non sia uno sviluppatore. Stiamo quindi creando un sito web "Configurator" che un analista aziendale può utilizzare per generare classi C# valide compilando un modulo con le opzioni pertinenti selezionate.

Qual è il modo migliore per generare una classe C# da un modello in un sito Web MVC? Si noti che non sto parlando di generare dinamicamente ed eseguire una classe in fase di esecuzione: stiamo essenzialmente generando un file di testo che contiene solo codice C# che verrà incluso in un progetto completamente diverso.

Questo sta dimostrando di essere un argomento molto difficile per google correttamente! Le opzioni che sono venuti fin qui ...

  • basta usare un file di testo in formato token e sostituire i valori utilizzando String.Format
  • usare in qualche modo il rasoio come un motore di template (ma non è sicuro di come, e non è html siamo 'generazione ri)
  • usare in qualche modo modelli T4 (almeno io so che è utilizzato per generare C#, ma non è sicuro come eseguire in fase di esecuzione)

Tutte le idee sul modo migliore per affrontare questo?

Come richiesto, ecco un esempio della classe di output/file. I valori qui sopra sostituiscono i valori impostati in una classe base con etichette specifiche del cliente, convalida, ecc. In questo modo personalizziamo il nostro prodotto per i clienti.

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" 
       }; 
     } 
    } 
} 

Aggiornamento: attualmente indagando modelli T4 a http://msdn.microsoft.com/en-us/library/ee844259(v=vs.100).aspx (grazie a commenti qui sotto). Sembra promettente.

+1

http://msdn.microsoft.com/en-us/library/bb126445.aspx sembra includere dettagli su come iniziare con T4 in fase di esecuzione. –

+0

Questo potrebbe anche essere di interesse: http://code.msdn.microsoft.com/windowsdesktop/Single-File-Generator-94d856d4 – Magrangs

+0

Puoi pubblicare un esempio di come appare questo file di configurazione? –

risposta

1

Suggerisco di evitare il sito Web e invece di andare semplicemente con CodeSmith. È possibile progettare script CodeSmith in modo che richieda informazioni e quindi generi il codice richiesto. Sembra molto meno lavoro, anche se devi comprare CodeSmith.

+0

Grazie per il suggerimento. Ho usato Codesmith un po 'in passato. Credo che il mio problema è che in questo caso voglio che le persone non tecniche inseriscano i dati che consentono la generazione delle classi. Lo sviluppatore dovrebbe quindi accedere e scaricare le classi in base a tali dati. È possibile che lo scopo di Codesmith sia cambiato negli ultimi 5 anni da quando l'ho suonato per l'ultima volta, ma penso che manchi l'interfaccia di inserimento. – centralscru

+1

@centralscru - CodeSmith consente di creare una finestra di dialogo che accetta i parametri utilizzati nella generazione. L'utente finale esegue semplicemente lo script, riempie le caselle e fa clic su OK. È quindi possibile salvare le classi generate in una condivisione UNC. –

0

Il metodo per eseguire questa operazione con il minimo sovraccarico sarebbe utilizzare Microsoft incorporato in CodeDOM API. Consente di creare e manipolare i documenti con codice CLR con il modello di oggetto documento compatibile con le lingue.

L'unico svantaggio di questo approccio è che non è immediatamente ovvio come implementare alcune funzionalità specifiche della lingua. Un esempio sono i campi C# readonly, perché non sono disponibili in tutte le lingue CLR, ma solo in C#. La soluzione per questa particolare complessità consiste nell'utilizzare uno CodeSnippet e inserire il codice manuale come stringa. Altri problemi di mismatch più complessi possono essere mitigati integrando il CodeDOM con un motore di template. Oleg Sych ha scritto a useful article on integrating CodeDOM with the T4 templating engine. Preferisco questo tipo di approccio a un approccio di pura generazione di testo, perché un modello di oggetto documento fortemente tipizzato è meno incline agli errori del puro testo.

Inoltre, se si decide di volere che il codice di output venga compilato, questo è supportato anche dall'API CodeDOM.

Se questa è una pratica che si ritiene possa essere molto utile, è possibile includere alcune comuni funzionalità di manipolazione DOM in chiamate di metodo fluide utilizzando lo builder pattern. Ho creato una libreria personale che utilizza questo approccio e ha avuto molto successo nell'aumentare la mia produttività tramite la generazione di codice.

Problemi correlati