2009-04-06 25 views
9

Me di cuenta de que la extensión MapRoute incluye una sobrecarga que acepta un parámetro de cadena [] que se denomina 'espacios de nombres'. Leí lo que Google tenía para mí en él, y supuestamente esto es para ayudar al framework a encontrar controladores en lugares que de otra manera no se verían.ASP.Net MVC Controller Namespace array

Hice algunos spiking y traté de poner los controladores en lugares raros. Puse uno en la carpeta Scripts; Incluso construí uno en un ensamble separado con un espacio de nombres raíz separado.

Sin poner anyting en los espacios de nombres param, todo funcionó bien. Si pongo solo uno de los espacios de nombres en el parámetro param de espacios de nombres, todavía encontré todos mis controladores. Pensé que tal vez usaría esa matriz para eliminar la ambigüedad entre los controladores con nombres similares, pero eso tampoco sucedió. Un HomeController en MyProj.Controllers y uno en SomeOtherName.Stuff colisionarían aún.

Entonces mi pregunta es, ¿ese parámetro está en desuso? ¿O todavía se usa de alguna manera de una manera que todavía tengo que discernir?

Respuesta

5

Ok, entonces después de más pruebas, descubrí que no es un filtro, exactamente, pero también lo es. Le di crédito de "respuesta" aunque esté parcialmente equivocado.

Así que, después de todo, funciona como pensé que debería decir, lo que significa que desambigua. Básicamente, el flujo lógico es algo como esto:

  • Busque un espacio de nombres en el _cache que coincide con uno en la matriz de espacios de nombres
    • si que se encuentra, busque un controlador del nombre correcto
    • - si es que se encuentra, devolverlo
    • - si no se encuentra, el retorno buscar en cualquier otro lugar que normalmente se vería
  • si no se encuentra, buscar en cada donde lese

Así que, en resumen, mi idea de que la matriz de espacios de nombres serviría para desambiguar es correcta.La razón por la que mi primera prueba en ese sentido falló es que solo hace una combinación perfecta, y cometí el error de usar solo la raíz n/s del conjunto (en otras palabras, MyRoot en lugar de MyRoot.Controllers).

Lo que este espacio de espacios de nombres permite, entonces, es tener un HomeController en dos espacios de nombres diferentes y unirlos de manera diferente dependiendo de la url o params.

4

No, el valor no está en desuso. Se usa en DefaultControllerFactory.cs. Tenga en cuenta que si se proporciona el valor, reemplaza completamente los espacios de nombre estándar buscados. Cuando el parámetro no se suministra, los espacios de nombres buscaron nuestra determinado por:

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

Cuando se suministra el parámetro, la lista que de alimentación reemplaza este valor.

En cualquiera de los casos, DefaultControllerFactory llama:

GetControllerTypeWithinNamespaces(controllerName, nsDefaults); 

... con la lista, ya sea el que se suministra, o el valor por defecto. Por lo tanto, está claro que el valor es compatible.

Cuando observa el código fuente allí, y en ControllerTypeCache, puede ver el verdadero propósito del valor de espacios de nombres: no hace que la fábrica del controlador busque en lugares que de otra manera no se verían; más bien es un filtro. En otras palabras, evita que la fábrica de controladores predeterminada busque y nombre espacios que de lo contrario buscaría controladores.

+0

Reconozco que así es como se supone que funciona, y encontré el mismo lugar que está describiendo en DefaultControllerFactory, pero cuando ejecuté las pruebas descritas anteriormente, no funcionó así. He proporcionado espacios de nombres que no existían, y la fábrica todavía encontró mi controlador. – Paul

+0

El código en ControllerTypeCache parece que funciona de esa manera para mí. Puede depurarlo construyendo con la fuente. Tal vez hay algo que no has suministrado? –

+0

Estoy de acuerdo en que se ve de esa manera, y construí w/la fuente cuando se prueba antes; Lo intentaré de nuevo con algunos parámetros diferentes. – Paul

Cuestiones relacionadas