2009-02-25 10 views
5

Attualmente sto utilizzando ASP.NT MVC RC1 per implementare un'applicazione di timesheet di base. Mi piacerebbe seguire i principi di ASCIUTTO ma trovarlo difficile in un caso particolare:Come rimanere DRY quando la logica ha bisogno di un'implementazione C# e Javascript?

Uno dei miei punti di vista, in realtà una vista parziale, ha un numero di caselle di testo che rappresentano il numero di ore trascorse su una determinata attività, una casella di testo al giorno della settimana. Quando inizialmente carico la pagina, voglio una casella di testo nella vista per visualizzare il totale di tutte quelle ore. Inoltre, voglio che quel totale si aggiorni mentre cambio i valori nelle caselle di testo. L'aggiornamento alle caselle di testo non causa un postback completo, solo un postback AJAX che non fa nulla con i risultati (il postback aggiorna il valore sul DB ma il ritorno ActionResult è un EmptyResult in quanto non c'è nulla che devo aggiornare sul UI).

Attualmente il controller crea una vista popolata con il "totale" per quella vista, quindi la logica che aggiunge tutti i valori è nel controller C#. Dal lato dell'interfaccia utente, ho javascript che aggiorna il totale sul livello dell'interfaccia utente. Ma questo non va bene perché se cambio la logica alla base del calcolo del totale, devo cambiarlo in due punti! AHH! NON ASCIUTTO!

Quindi, come posso fare questo? L'unica risposta che mi viene in mente è quella di eliminare il codice javascript che calcola il totale sull'interfaccia utente e invece il postback AJAX restituire il nuovo "totale" per quella vista.

Ci sono altri approcci?

risposta

1

Avere la logica per sommare il tempo in C# e Javascript non è ASCIUTTO nel senso più stretto, è vero. Uno potrebbe dividere i capelli sul fatto che sono due lingue diverse che operano in due ambienti separati, ma alla fine della giornata se si cambia uno si deve cambiare entrambi.

Penso che sia un compromesso tra forma e funzione. Quanto è importante avere il javascript? Se la chiamata AJAX è troppo lenta (una possibilità reale), allora potrebbe essere il momento di rendersi conto che il principio ASCIUTTO è un principio guida, non una legge.

+2

È * un * principio guida, non una legge. Se hai bisogno della logica in entrambi i casi, e non è tecnicamente fattibile condividere la stessa implementazione, dovrai implementarla due volte. Buona fortuna, questa è la vita. ;) – jalf

+0

@jalf: esattamente. Una (qualsiasi) linea guida non è una legge di esistenza indissolubile. – Richard

+0

OK, annotato e modificato;) –

0

Se si desidera che il codice venga eseguito su entrambi, il server e il client, è possibile utilizzare/scrivere un albero di espressioni nel compilatore JavaScript.

Sul lato server, si valuta l'espressione e si invia la stessa espressione tradotta in JavaScript al client.

+0

Stai suggerendo di utilizzare un traduttore C# -> Javascript per creare il lato client javascript? O forse intendi usare javascript sia dal lato server che lato client? –

+0

No, penso che intendesse dire avere una "espressione" che può essere eseguita sia da C# che da Javascript –

+0

Sì e no. Gli alberi di espressione sono rappresentazioni in memoria di un sottoinsieme di espressioni C#/VB.NET. Possono essere facilmente valutati sul server. Dovresti comunque scrivere un componente che traduca tali alberi di espressione in JavaScript. –

3

Si potrebbe provare Nikhil Kothari's Script# project. È un cross-compiler che si compila e si traduce da C# in javascript indipendente dal browser, che ti consente di condividere la logica. È usato da molti gruppi all'interno di Microsoft esattamente per quello scopo.

Più, dal sito web:

Script # porta la produttività a Ajax e lo sviluppo JavaScript. Script # è uno strumento gratuito che consente agli sviluppatori di creare codice C# source e di compilarlo successivamente in uno script regolare che funziona su tutti i browser moderni, e, facendo ciò, sfruttare la produttività e gli strumenti .NET esistenti nonché la potenza esistente. l'IDE di Visual Studio. Script # ti offre una metodologia di sviluppo e un approccio che porta l'ingegneria del software , la manutenzione a lungo termine e gli approcci di sviluppo scalabili per le tue applicazioni Ajax, i componenti e le strutture .

Script # è ampiamente utilizzato dagli sviluppatori all'interno di Microsoft building esperienze Ajax in Windows Live, Office per citarne solo un paio, come così come da sviluppatori esterni e aziende tra cui Facebook. Se stai costruendo applicazioni RIA basate su Ajax, devi farlo a e prova a Script # oggi e vedere se può aiutare a migliorare il tuo sviluppo Ajax !