命名空间的区别只能在有第三方库时才使用,并且要避免区分我们自己编写的类吗?C#和命名空间
在Web Api中,如果控制器和动作名称相同但名称空间不同,则不会发生路由并发出404错误。我发现自定义控制器选择器可以用来克服这个问题,但由于内置选择器忽略了它,我不知道这是否是一个故意的设计决定。为什么我应该避免只通过名称空间区分是否有原因?
命名空间的区别只能在有第三方库时才使用,并且要避免区分我们自己编写的类吗?C#和命名空间
在Web Api中,如果控制器和动作名称相同但名称空间不同,则不会发生路由并发出404错误。我发现自定义控制器选择器可以用来克服这个问题,但由于内置选择器忽略了它,我不知道这是否是一个故意的设计决定。为什么我应该避免只通过名称空间区分是否有原因?
在ASP.NET MVC/WebApi中,路由从Controller
的名称自动确定。因此,如果有两个相同名称的Controller
,并且不覆盖RouteAttribute
的路线,则它们共享相同的路线。
有两种方法可以解决这个问题:
使用Areas
:区域意味着您的应用程序分成多个MVCS,每个特定部分(由认证/授权规则通常分开)。这看起来像:
覆盖的route
该控制器使用(虽然未经测试,不知道这是否会工作):
[Route("MyHome")]
public class HomeController : Controller
{
}
[Route("MySecondHome")]
public class HomeController : ApiController
{
}
还要注意,对于RouteAttribute
到工作,你需要先启用它。你可以找到更多的信息here。
public static void Register(HttpConfiguration config)
{
// Attribute routing.
config.MapHttpAttributeRoutes();
// Convention-based routing.
config.Routes.MapHttpRoute(
name: "DefaultApi",
routeTemplate: "api/{controller}/{id}",
defaults: new { id = RouteParameter.Optional }
);
}
但是,你应该尝试不使用类具有相同的名称,而不考虑命名空间结构。这使得更难识别你正在处理的是什么。
是的,命名相同的东西往往会相互混淆(由人类)。 – Amy
你能说说我们有什么**好处**有两件事(例如控制器)称为相同的东西,但在不同的命名空间是@JohnL? – mjwills
在我的第一份工作中,我曾在另一个艾米的工作地点工作。每当通过扩声系统发出呼叫时,我们四个人都会出现在前台。最终我们给了对方绰号(我是Scooter)来区分我们。不要让这发生在你的代码中。尝试给出与众不同的名称*和*使用名称空间在逻辑上组织它们。 – Amy