2009-04-06 22 views
9

Zauważyłem, że rozszerzenie MapRoute zawiera przeciążenie, które akceptuje parametr string [], który nazywa się "namespaces". Czytałem, co Google dla mnie na ten temat, i rzekomo ma to pomóc ramie znaleźć kontrolerów w miejscach, w których inaczej by nie wyglądało.Macierz przestrzeni nazw kontrolera ASP.Net MVC

Zrobiłem spike i próbowałem umieścić kontrolerów w dziwnych miejscach. Umieściłem jeden w folderze Skrypty; Zbudowałem nawet jeden w osobnym zestawie z oddzielną główną przestrzenią nazw.

Bez stawiania czegoś w param przestrzeni nazw wszystko działało dobrze. Jeśli umieściłem tylko jedną przestrzeń nazw w paramencie nazw, to nadal znajdowałem wszystkie moje kontrolery. Pomyślałem, że może użyje tej tablicy do rozróżnienia między kontrolerami o podobnych nazwach, ale tak się nie stało. HomeController w MyProj.Controllers i jeden w SomeOtherName.Stuff nadal by się kolidował.

Moje pytanie brzmi, czy ten parametr jest przestarzały? A może nadal jest używany w taki sposób, że jeszcze go nie rozpoznaję?

Odpowiedz

5

OK, więc po dalszych testach zorientowałem się, że to nie jest filtr, ale to również jest. Dałem ci "odpowiedź", nawet jeśli jesteś częściowo w błędzie.

W końcu zachowuje się tak, jakbym myślał, że to znaczy, że to ujednoznacznia. Zasadniczo, przepływ logiczny jest coś takiego:

  • Spójrz na obszarze nazw w _cache który odpowiada jeden w tablicy przestrzeni nazw
    • jeśli to znaleźć, poszukaj sterownika właściwej nazwy
    • - jeśli to znaleźć, zwrócić go
    • - jeśli nie jest znaleziony, powrót szukać wszędzie że to normalnie wyglądać
  • gdyby nie znalazł, szukaj każdy gdzie lese

Krótko mówiąc, moja myśl, że tablica przestrzeni nazw służy do ujednoznacznienia, była poprawna.Powodem, dla którego mój pierwszy test w tym względzie się nie udał, jest to, że idealnie pasuje i popełniłem błąd, używając tylko root'a n/s ze złożenia (innymi słowy, MyRoot zamiast MyRoot.Controllers).

To, co pozwala na to przestrzeń nazw, polega na tym, że HomeController ma dwie różne przestrzenie nazw i dopasowuje je w różny sposób w zależności od adresu URL lub parametrów.

4

Nie, wartość nie jest przestarzała. Jest używany w DefaultControllerFactory.cs. Zauważ, że jeśli podana jest wartość, całkowicie zastępuje standardowe spacje nazw wyszukiwanych. Jeżeli parametr nie jest dostarczany, przeszukano przestrzenie nazw naszych określona przez:

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

gdy parametr dostarczany jest lista podać zastępuje tę wartość.

W obu przypadkach DefaultControllerFactory wzywa:

GetControllerTypeWithinNamespaces(controllerName, nsDefaults); 

... z listy, albo ten, który dostarczany lub domyślna. Jest więc jasne, że wartość jest obsługiwana.

Kiedy patrzysz na kod źródłowy tam, oraz w ControllerTypeCache, możesz zobaczyć prawdziwy cel wartości przestrzeni nazw: Nie powoduje to, że fabryka kontrolera patrzy w miejsca, które inaczej by nie wyglądały; raczej to filtr. Innymi słowy, uniemożliwia to wygląd domyślnej fabryki kontrolerów i spacje nazw, które w innym przypadku szukałyby kontrolerów.

+0

Rozumiem, że tak to powinno działać, i znalazłem to samo miejsce, które opisujesz w DefaultControllerFactory, ale kiedy przeprowadziłem opisane powyżej testy, to nie działa. Dostarczone przestrzenie nazw, które nie istniały, a fabryka wciąż znajdowała mojego kontrolera. – Paul

+0

Kod w ControllerTypeCache pewnie wygląda tak, jak działa w ten sposób. Możesz debugować go, budując ze źródłem. Być może jest coś, czego nie dostarczyłeś? –

+0

Zgadzam się, że wygląda to w ten sposób, a ja zbudowałem w źródle podczas testów; Spróbuję ponownie w/kilka różnych params. – Paul

Powiązane problemy