2012-10-13 19 views
5

Sto sviluppando un generatore di codice per generare modelli, controller e viste basati su tabelle di database in modo da poter creare un sito Web MVC3 Asp.Net. Posso generare modelli e controller con CodeDOM ora ma per generare viste ho bisogno di qualcosa per creare i template, come generare un .cshtml da un .cs, pensavo che T4 sarebbe stata una buona idea ma alcuni dei miei colleghi insistono nel non usare T4, è ci sono altri modi? grazieEsiste comunque la possibilità di generare visualizzazioni Razor (.cshtml) basate su un modello accanto a T4?

+0

Cosa c'è di sbagliato con t4 secondo ad un tuo collega? –

+3

Non sai perché i tuoi colleghi non vogliono usare T4. È un sistema molto potente ed è gratuito. Viene fornito con Visual Studio, quindi non ci sono costi di licenza aggiuntivi. Questo è un enorme incentivo per usarlo. –

+0

Non so esattamente, dicono che è un po 'complicato e difficile da fare un codice pulito. – ePezhman

risposta

0

Abbiamo utilizzato estesamente il codice smith e anche scritto un plug-in. Con t4 però puoi semplicemente generare le classi e quindi rimuovere il modello - perché l'opposizione lì a T4?

+0

Non potrei essere un commento? –

+0

@wiktor zychla, risponde alla domanda "ci sono altri modi" a cui ho risposto –

+0

grazie, l'ho verificato, per questo passo sono più alla ricerca di qualcosa di open source e gratuito – ePezhman

0

Certamente, utilizzo Razor per tutta la mia generazione di codice (e generazione di e-mail, ecc.) Utilizzando la piacevole estensione RazorGenerator. Ti consente di specificare questa estensione come "strumento personalizzato" e genera una classe C# risultante dall'input .cshtml che puoi invocare (e passare in un @model) per trasformare il testo in qualsiasi output che ti piace. (un po 'ironicamente nel tuo caso, sarebbe rasoio => rasoio conversioni)

+0

Ora eseguo questo razorGenerator, come hai detto che genera da .cshtml, ho bisogno di generare in .cshtml Non ho bisogno di viste precompilate. – ePezhman

+0

@ePezhman, che cos'è la mia risposta che ti fa pensare che non puoi usare questa tecnica per generare file '.cshtml'? (questo è ciò che intendevo per "rasoio => rasoio conversioni") –

+0

Immagino che il razorGenerator sia per la creazione di viste del rasoio precompilate, ho lavorato un po 'con quello e non ho visto nessuna opzione per ottenere un output .cshtml. – ePezhman

5

Non sono sicuro del motivo per cui sarebbero contrari all'uso di T4 come molte librerie di codici là fuori, incluso Entity Framework. Sembra che tu stia facendo qualcosa che ho appena finito di fare. Mi piaceva usare i modelli di T4 pre-elaborati, così sono in grado di nutrire i dati in essi dal codice C# e generare i file in questo modo. Ciò consente di avere più file in uscita e sostanzialmente parametri con cui passare i dati.

Il modo in cui lo uso è .. Ho creato una classe che è stata utilizzata per raccogliere tutte le informazioni sui database .. quali tabelle includere o escludere .. e quindi le informazioni su ogni colonna come pk o identità nullable e tali . Ho collegato i miei modelli di T4 preelaborati con quelle informazioni che sono state in grado di generare tutto il codice SQL, le viste, i modelli, le informazioni del controller .. e ogni volta che il database è cambiato .. ho appena eseguito la mia app per console e bam tutto rigenerato.

pre-elaborato: http://odetocode.com/Blogs/scott/archive/2011/01/03/preprocessed-t4-templates.aspx

Entity Framework: http://msdn.microsoft.com/en-us/data/gg558520.aspx

MVCScaffolding: http://blog.stevensanderson.com/2011/04/06/mvcscaffolding-overriding-the-t4-templates/

T4MVC: http://mvccontrib.codeplex.com/wikipage?title=T4MVC

Ancora una volta So che questo non aiuta a rispondere alla tua domanda, ma T4 è INCREDIBILE e sarei interessato a sentire la discussione sul perché non usare T4 .. è addirittura integrato!

btw qui ottiene qualche intellisense !: http://t4-editor.tangible-engineering.com/T4-Editor-Visual-T4-Editing.html

Se yo qualsiasi domanda non esitate a colpirmi fino amo T4 e sarei disposto a rispondere a qualsiasi domanda che posso.

Ecco un esempio di un modello che utilizzo per generare i miei modelli POCO .. molto è stato estratto grazie alle capacità preelaborate di utilizzare i miei normali metodi C# per passare i dati. Questo modello crea 55 modelli per me basato fuori dalle tabelle in un database.

Il mio "SchemeCollector" utilizza una classe DatabaseInfo, TableInfo e ColumnInfo che ho creato per contenere tutto lo schema di cui ho bisogno. Poi ho altri 9 modelli T4 che usano anche la classe SchemaCollector per popolare i dati.

Ecco l'estensione che uso per passare i dati nel modello per la generazione.Ho tutto questo setup per usare anche i file XML per la configurazione ma non è necessario, volevo solo che fosse davvero riutilizzabile.

public partial class PocoGenerator 
    { 
     public string Namespace { get; set; } 
     public string Inherit { get; set; } 
     public DatabaseInfo Schema { get; set; } 
     public bool Contract { get; set; } 
     public string SavePath { get; set; } 
    } 

Ecco il metodo che utilizzo per chiamare e compilare il modello e salvarlo.

static void GeneratePoco(Config config) 
     { 
      var template = config.Poco; 
      template.Schema = config.DatabaseInfo; 

      File.WriteAllText(template.SavePath, template.TransformText()); 

      Console.WriteLine("  - POCOs generated for " + config.DatabaseInfo.DatabaseName + " complete"); 
     } 

Ecco il modello

<#@ template debug="true" hostSpecific="true" #> 
<#@ output extension=".cs" #> 
<#@ Assembly Name="System.Core.dll" #> 
<#@ Assembly Name="System.Windows.Forms.dll" #> 
<#@ import namespace="System" #> 
<#@ import namespace="System.IO" #> 
<#@ import namespace="System.Diagnostics" #> 
<#@ import namespace="System.Linq" #> 
<#@ import namespace="System.Collections" #> 
<#@ import namespace="System.Collections.Generic" #> 
<#@ assembly name="System.Xml.dll" #> 
<#@ assembly name="System.Data.dll" #> 
<#@ import namespace="System.Data" #> 
<#@ import namespace="System.Data.SqlClient" #> 
<#@ import namespace="CodeGenerator.Utilities" #> 

using System; 
using System.Runtime.Serialization; 

namespace My.Models 
{ <# 
     List<TableInfo> tables = Schema.Tables; 
    #> 

    //######################################################################################################### 
    // This file has been generated from the tables contained in the <#= Schema.DatabaseName #> database. 
    // Changes to this file will be overwritten when the file is regenerated. Generated: <#= DateTime.Now #> 
    //######################################################################################################### 
    <# 
    foreach (TableInfo table in tables) 
    { 
    #> 

    [DataContract] 
    public class <#= table.Name #> : IConfigTable 
    { 

     <# 
     PushIndent("  "); 
      foreach (ColumnInfo col in table.Columns) 
      { 
       if(col.IsKey || col.IsIdentity) 
        WriteLine("[Key]"); 

       WriteLine("[DataMember]"); 
       if(col.IsNullable && col.Type != "string") 
        WriteLine("public " + col.Type + "? " + col.Name+ " { get; set; }"); 
       else 
        WriteLine("public " + col.Type + " " + col.Name+ " { get; set; }"); 
      }PopIndent();#>  
    } 
    <# } #> 
} 
0

Abbiamo compito simile, stiamo crating moduli web dinamiche che si basano sul file di JSON di input con definizione del modulo. L'editor specifica i diversi controlli da presentare su un modulo (i controlli contengono proprietà, azioni, validatori diversi). Qui di seguito cercherò di descrivere procedura di base di una nostra logica:

  1. Deserilize e convalidare il file JSON.
  2. Preparare i dati che verranno passati al modello T4.
  3. Genera modelli MVC e controller dai dati (passo 2).
  4. Generare classi aggiuntive (ad esempio alcuni helper, tipi complessi da un modello).
  5. Aggiungi al montaggio risorse incorporate quali origini dati ecc., Immagini qualsiasi.
  6. Compila tutto quanto sopra.
  7. Drop dll nella cartella dei modelli.
  8. Riavviare il sito.

Tutte le strutture: il modello ha le [UIHint] attributi con nomi di viste parziali. Abbiamo circa 10 viste parziali che sanno come rappresentare ciascuna proprietà. Per supportare questa logica estendiamo il provider ViewEngine e ModelMetadata.

ViewEngine cerca le viste nella cartella aggiuntiva. Il fornitore ModelMetada aggiunge alle proprietà personalizzate "AdditionalValues".

nostro punto di vista per un modello ha una fila

@Html.EditorForModel() 

Avevamo overrided Object.cshtml per gestire 'profondo legame'. Le parti più difficili erano le collezioni in cui gli elementi di raccolta erano di un tipo complesso.

Problemi correlati