我注意到MapRoute扩展包含一个重载,该重载接受名为“string[]”的命名空间参数。我读到了Google为我准备的东西,据推测,这是为了帮助框架在其他地方找不到的控制器。
我做了一些尖峰测试,并尝试将控制器放置在奇怪的位置。我将一个放在Scripts文件夹中;我甚至在具有独立根命名空间的单独程序集中构建了一个。
没有在名称空间参数中放置任何内容,一切都运行得很好。如果我只将其中一个命名空间放在命名空间参数中,它仍然会找到我所有的控制器。我认为它可能会使用该数组来消除相似命名的控制器之间的歧义,但这也没有发生。MyProj.Controllers中的一个HomeController和SomeOtherName.Stuff中的一个仍然会发生冲突。
所以我的问题是,这个参数被弃用了吗?或者它仍然以某种我尚未察觉的方式被使用?
发布于 2009-04-06 19:37:46
好的,经过进一步的测试,我发现它不是一个过滤器,确切地说,但它也是一个过滤器。即使你部分错了,我还是给了你“答案”的信任。
所以,它毕竟表现得像我想的那样,也就是说它消除了歧义。基本上,逻辑流程是这样的:
因此,简而言之,我认为名称空间数组用于消除歧义的想法是正确的。我在这方面的第一个测试失败的原因是它只做了一个完美的匹配,并且我犯了一个错误,只使用了程序集中的根n/s (换句话说,MyRoot而不是MyRoot.Controllers)。
命名空间允许在两个不同的命名空间中有一个HomeController,并根据url或参数以不同的方式匹配它们。
发布于 2009-04-06 14:52:13
否,该值未被弃用。它在DefaultControllerFactory.cs中使用。请注意,如果提供了该值,它将完全替换搜索到的标准名称空间。如果未提供该参数,则搜索的名称空间由以下内容确定:
HashSet<string> nsDefaults = new HashSet<string>(ControllerBuilder.DefaultNamespaces, StringComparer.OrdinalIgnoreCase);
提供该参数时,您提供的列表将替换此值。
在这两种情况下,DefaultControllerFactory都会调用:
GetControllerTypeWithinNamespaces(controllerName, nsDefaults);
...with列表,可以是您提供的列表,也可以是默认列表。因此很明显,该值是受支持的。
当您查看ControllerTypeCache中的源代码时,您可以看到名称空间值的真正用途:它不会导致控制器工厂查找否则不会查找的位置;相反,它是一个过滤器。换句话说,它阻止了默认的控制器工厂查找和命名空间,否则它将搜索控制器。
https://stackoverflow.com/questions/721700
复制相似问题