2009-12-18 3 views
9

Vorrei poter generare URL da una RouteCollection senza accedere a HttpContext. Osservando il modo in cui RouteCollection viene implementato, tutti i metodi richiedono l'accesso a un RequestContext per ottenere il percorso virtuale.ASP.NET MVC - Genera percorsi senza Http/Richiesta contesto

Ho lavorato su questo prendendo in giro il HttpContext ma questo aggiunge una dipendenza imbarazzante su RhinoMocks e non è una soluzione ragionevole. Ho altre opzioni per generare URL al di fuori del contesto?

risposta

1

Ci scusiamo, ma ci si abitua a prendere in giro il framework MVC. Appena entrerai in prova, ne avrai bisogno. C'è così tanto là: HttpContext, Session, Server - tutte cose che si riversano nel controller. Se si desidera generare il percorso, è necessario parlare con HttpContext (in MVC, questo è in realtà HttpContextBase, quindi è possibile scrivere la propria implementazione concreta presumo) oppure è necessario prenderlo in giro.

+1

Non sono contrario a prendere in giro situazioni di prova. Tuttavia, non sto facendo questo in un test. Sto generando e-mail tramite un servizio asincrono. Dal momento che è asincrono non c'è accesso a HttpRequest. – bromanko

+0

Presumibilmente un'azione sta dando il via al processo che genera email. Prova a effettuare la chiamata di routing dall'interno dell'azione (quando hai accesso a un RequestContext), quindi passa il risultato a qualunque processo generi le email. – Levi

+0

Ci sono casi in cui le e-mail sono generate senza che il web le abbia attivate. Ad esempio, email quotidiane o email di promemoria. – bromanko

3

Una bella domanda, davvero. L'instradamento stesso ha alcune dipendenze per essere chiamato da un'applicazione ASP.NET in esecuzione, come ottenere l'URL radice dell'applicazione e tutti i moduli di configurazione o cookie di sessione che entrano anche nell'URL. Mentre la creazione di oggetti mock è una soluzione teorica, non è certamente raccomandata per essere utilizzata in fase di runtime.

La mia raccomandazione è di non utilizzare il routing per questa situazione e di codificare gli URL nelle e-mail. I collegamenti in un'email devono avere URL completi (nome host + percorso) e il routing non può nemmeno generare il nome host per l'URL, quindi è qualcosa che dovresti già avere hardcode.