我注意到MapRoute扩展包含一个重载,它接受一个名为'namespaces'的string []参数。我读了谷歌对我的看法,据说这是为了帮助框架在不会看到的地方找到控制器。
我做了一些尖峰,并尝试将控制器放在奇怪的位置。我把一个放在Scripts文件夹中;我甚至在一个单独的程序集中构建了一个具有单独的根命名空间
没有在命名空间参数中添加任何内容,一切正常。如果我只在命名空间参数中放置一个命名空间,它仍然可以找到我的所有控制器。我想也许它会使用该数组来消除类似命名的控制器之间的歧义,但这也没有发生。 MyProj.Controllers中的HomeController和SomeOtherName.Stuff中的HomeController会发生冲突。
所以我的问题是,该参数是否已被弃用?或者它仍以某种方式用于我尚未辨别的方式?
答案 0 :(得分:5)
好的,经过进一步的测试,我发现它不是一个过滤器,确切地说,但它也有点。即使你有部分错误,我也给你“回答”信用。
所以,毕竟,它确实像我认为的那样应该说它消除歧义。基本上,逻辑流程是这样的:
因此,简而言之,我认为命名空间数组可以消除歧义是正确的。我在这方面的第一次测试失败的原因是它只是完美匹配,我错误地只使用了程序集中的根n / s(换句话说,MyRoot而不是MyRoot.Controllers)。
这个名称空间允许的是在两个不同的名称空间中有一个HomeController,并根据url或params不同地匹配它们。
答案 1 :(得分:4)
不,该值不会被弃用。它在DefaultControllerFactory.cs中使用。请注意,如果提供了该值,它将完全替换搜索的标准名称空间。当未提供参数时,搜索的名称空间由我们确定:
HashSet<string> nsDefaults = new HashSet<string>(ControllerBuilder.DefaultNamespaces, StringComparer.OrdinalIgnoreCase);
提供参数后,您提供的列表将替换此值。
在任何一种情况下,DefaultControllerFactory都会调用:
GetControllerTypeWithinNamespaces(controllerName, nsDefaults);
...使用列表,您提供的列表或默认值。很明显,该值是受支持的。
当你查看那里的源代码时,在ControllerTypeCache中,你可以看到命名空间值的真正目的:它不会导致控制器工厂查看本来看不到的地方;而它是一个过滤器。换句话说,它可以防止默认控制器工厂查找和命名空格,否则它将搜索控制器。