2011-10-21 7 views
5

Con il CTP di Roslyn allo scoperto, possiamo provare a pensare a cose interessanti che possiamo fare con esso oltre a scrivere script in C#.Usa Roslyn per compilare i controller dinamicamente

Dal asp.net mvc consente di scrivere le fabbriche del controller personalizzato, si potrebbe scrivere una fabbrica che

  • compila i controllori del file di origine on-the-fly
  • Caricare il tipo di nuova creazione in per il tempo di esecuzione (in grado di gestire il runtime che?)
  • E non tener conto del tipo precedente, se le richieste precedenti per lo stesso controller sono già stati fatti

Questo farebbe permette u s per prototipare o modificare rapidamente i controller, basta semplicemente scrivere il codice e controllerfactory raccoglierà le modifiche senza la necessità di ricompilare.

+2

Questo può essere fatto senza Roslyn. – Ankur

+0

Dai un'occhiata a Orchard CMS: carica dinamicamente moduli dal codice sorgente oggi. –

+0

Orchard lo fa compilando csproj prima di caricare gli assembly, ma lo descrive come "un po 'sperimentale": http://www.orchardproject.net/docs/Orchard-module-loader-and-dynamic-compilation.ashx – Thomas

risposta

5

Ho già implementato i controller di runtime utilizzando il compilatore monos come servizio alcuni mesi fa.

È possibile trovare le informazioni e link al codice su github qui: http://www.fusonic.net/en/blog/2011/04/01/scripting-asp-net-mvc-controllers-at-runtime/

Anche se sembra davvero bello, all'inizio, non è che super utile nel mondo reale a causa di diverse limitazioni.

Prima di tutto Visual Studio si trova nel mezzo di te e del tuo codice perché blocca rigorosamente e vieta la modifica del codice sorgente durante il debug. Quindi l'unico modo per modificare i tuoi file sorgente è eseguirlo senza un debugger collegato.

Il secondo problema è che è (ovviamente) limitato ai controllori. Non appena inizi a modificare i controller in fase di esecuzione, desideri un vero ambiente di scripting! Ad esempio, per cambiare modelli, servizi e il codice che si ha nel progetto in fase di esecuzione.

allora si ha il problema che si può `t debug del codice dinamico e così via ...

ho smesso di usarlo dopo alcuni giorni perché non è solo una soluzione completa. Sto sognando una soluzione per .net in cui l'intero progetto mvc può essere compilato dinamicamente in fase di runtime, non limitato ai controller (come un vero framework di scripting) e incluso il debugging.

Nel java-mondo c'è una soluzione per questo: http://zeroturnaround.com/jrebel/

+0

Quindi è possibile, ma non è conveniente lavorare con. – Thomas

+0

Sto usando mono per farlo nel mio progetto asp mvc 3. È davvero un approccio che ti consente di risparmiare tempo quando il tuo progetto è grande. – lontivero

2

Non so molto delle fabbriche di controller MVC, ma sì, sembra qualcosa che potrebbe essere fatto. Il passaggio 2 potrebbe essere eseguito con un assembly.Load() standard del codice emesso. Roslyn ha anche la possibilità di compilare un metodo dinamico, se possibile, che è ancora più leggero.

Per un esempio correlato, dare un'occhiata al prototipo Razor view engine che David Ebbo ha messo insieme.

+0

Come faccio esattamente a trasformare uno scriptlet in un metodo dinamico? –

1

Date un'occhiata a ScriptCs. Credo che prima sarà possibile fare cose del genere.