Массив пространства имен контроллера MVC ASP.Net - PullRequest
9 голосов
/ 06 апреля 2009

Я заметил, что расширение MapRoute включает перегрузку, которая принимает параметр string [], который называется «пространства имен». Я прочитал, что Google сделал для меня на нем, и, предположительно, это должно помочь каркасу найти контроллеры в тех местах, которые иначе бы не выглядели.

Я сделал несколько всплесков и попытался поместить контроллеры в странные места. Я положил один в папку Scripts; Я даже построил один в отдельной сборке с отдельным корневым пространством имен.

Не помещая ничего в параметр пространства имен, все работало нормально. Если я добавлю только одно из пространств имен в параметр namespaces, он все равно найдет все мои контроллеры. Я подумал, что, возможно, он будет использовать этот массив для устранения неоднозначности между контроллерами с одинаковыми именами, но этого тоже не произошло. HomeController в MyProj.Controllers и один в SomeOtherName.Stuff все равно будут сталкиваться.

Итак, мой вопрос: этот параметр устарел? Или это все еще используется каким-то образом, который я еще не различил?

Ответы [ 2 ]

5 голосов
/ 06 апреля 2009

Хорошо, так что после дальнейшего тестирования я понял, что это не фильтр, но это тоже так. Я дал вам «ответ», хотя вы частично ошибаетесь.

Так что, в конце концов, он действует так, как я думал, и должен сказать, что это однозначно. По сути, логический поток выглядит примерно так:

  • Ищите пространство имен в _cache, которое совпадает с пространством имен в массиве пространств имен
    • если он найден, ищите контроллер с правильным именем
    • - если он найден, верните его
    • - если он не найден, возвращайте поиск везде, где он обычно выглядит
  • если он не найден, ищите везде lese

Итак, короче говоря, моя мысль о том, что массив пространств имен будет служить для устранения неоднозначности, была правильной. Причина, по которой мой первый тест в этом отношении не удался, заключается в том, что он дает только идеальное соответствие, и я допустил ошибку, используя только корневые н / с из сборки (другими словами, MyRoot вместо MyRoot.Controllers).

То, что позволяет использовать это пространство имен, - это иметь HomeController в двух разных пространствах имен и сопоставлять их по-разному, в зависимости от URL или параметров.

4 голосов
/ 06 апреля 2009

Нет, значение не считается устаревшим. Он используется в DefaultControllerFactory.cs. Обратите внимание, что если указано значение, оно полностью заменяет искомые стандартные пространства имен. Когда параметр не указан, пространства имен ищутся по определению:

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

Когда указан параметр, указанный вами список заменяет это значение.

В любом случае DefaultControllerFactory вызывает:

GetControllerTypeWithinNamespaces(controllerName, nsDefaults);

... со списком, либо предоставленным вами, либо по умолчанию. Таким образом, ясно, что значение поддерживается.

Когда вы посмотрите на исходный код там и в ControllerTypeCache, вы увидите реальную цель значения пространства имен: это не заставляет фабрику контроллера искать в местах, которые иначе не выглядели бы; скорее это фильтр . Другими словами, он не позволяет фабрике контроллеров по умолчанию искать и именовать пространства, которые он мог бы искать для контроллеров.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...