2009-04-06 4 views
9

Ho notato che l'estensione MapRoute include un overload che accetta un parametro string [] chiamato "namespace". Ho letto quello che Google aveva per me su di esso, e presumibilmente questo è per aiutare il framework a trovare controller in posti che altrimenti non guarderebbero.ASP.Net MVC Controller Namespace array

Ho fatto un po 'di spike e ho provato a mettere i controller in posizioni strane. Ne ho inserito uno nella cartella Scripts; Ne ho persino creato uno in un assieme separato con uno spazio dei nomi radice separato.

Senza mettere alcun parametro nello spazio dei nomi, tutto ha funzionato bene. Se metto solo uno dei namespace nel param dei namespace, trova ancora tutti i miei controller. Ho pensato che forse avrebbe usato quell'array per disambiguare tra controller identici, ma non è successo neanche quello. Un HomeController in MyProj.Controllers e uno in SomeOtherName.Stuff si scontreranno ancora.

Quindi la mia domanda è, il parametro è deprecato? O è ancora usato in qualche modo in un modo che devo ancora discernere?

risposta

5

Ok, quindi dopo ulteriori test, ho capito che non è un filtro, esattamente, ma è anche un po '. Ti ho dato credito "rispondi" anche se hai parzialmente torto.

Quindi, dopotutto, si comporta come pensavo che dovrebbe dire che si disambigura. In sostanza, il flusso logico è qualcosa di simile:

  • Cercare uno spazio dei nomi nel _cache che corrisponde a uno nel namespace matrice
    • se che ha trovato, cercare un controllore del nome giusto
    • - se che ha trovato, restituirlo
    • - se non è trovata, tornare ricerca ovunque che sarebbe normalmente guardare
  • se non è trovato, cercare ogni dove lese

Quindi, in breve, il mio pensiero che la matrice dei namespace avrebbe servito a disambiguare era corretta.Il motivo per cui il mio primo test a questo proposito è fallito è che fa solo una corrispondenza perfetta, e ho commesso l'errore di usare solo il root n/s dell'assembly (in altre parole, MyRoot invece di MyRoot.Controllers).

Ciò che questa cosa dello spazio dei nomi consente, quindi, è di avere un HomeController in due diversi spazi dei nomi e abbinarli in modo diverso a seconda dell'URL o dei parametri.

4

No, il valore non è deprecato. È usato in DefaultControllerFactory.cs. Si noti che se viene fornito il valore, sostituisce completamente gli spazi dei nomi standard ricercati. Quando il parametro non viene fornito, gli spazi dei nomi cercati nostra determinato da:

HashSet<string> nsDefaults = new HashSet<string>(ControllerBuilder.DefaultNamespaces, StringComparer.OrdinalIgnoreCase); 

Quando il parametro è fornito, la lista si fornisce sostituisce questo valore.

In entrambi i casi, DefaultControllerFactory chiama:

GetControllerTypeWithinNamespaces(controllerName, nsDefaults); 

... con la lista, sia quello da Lei forniti, o quello predefinito. Quindi è chiaro che il valore è supportato.

Quando si guarda il codice sorgente lì, e in ControllerTypeCache, è possibile vedere lo scopo reale del valore dei namespace: non fa in modo che la fabbrica del controller guardi in posti che altrimenti non apparirebbero; piuttosto è un filtro. In altre parole, impedisce al factory di default di controllare gli spazi dei nomi che altrimenti cercherebbe i controller.

+0

Riconosco che è così che dovrebbe funzionare, e ho trovato lo stesso punto che stai descrivendo in DefaultControllerFactory, ma quando ho eseguito i test sopra descritti, non è così che ha funzionato. Ho fornito spazi dei nomi che non esistevano e la fabbrica ha ancora trovato il mio controller. – Paul

+0

Il codice in ControllerTypeCache sembra sicuro che funzioni in questo modo per me. Puoi eseguirne il debug costruendo con la fonte. Forse c'è qualcosa che non hai fornito? –

+0

Sono d'accordo che sembra così, e ho costruito w/the source prima di testare; Proverò di nuovo con alcuni parametri diversi. – Paul