2017-09-13 125 views
-3

命名空间的区别只能在有第三方库时才使用,并且要避免区分我们自己编写的类吗?C#和命名空间

在Web Api中,如果控制器和动作名称相同但名称空间不同,则不会发生路由并发出404错误。我发现自定义控制器选择器可以用来克服这个问题,但由于内置选择器忽略了它,我不知道这是否是一个故意的设计决定。为什么我应该避免只通过名称空间区分是否有原因?

+2

是的,命名相同的东西往往会相互混淆(由人类)。 – Amy

+0

你能说说我们有什么**好处**有两件事(例如控制器)称为相同的东西,但在不同的命名空间是@JohnL? – mjwills

+3

在我的第一份工作中,我曾在另一个艾米的工作地点工作。每当通过扩声系统发出呼叫时,我们四个人都会出现在前台。最终我们给了对方绰号(我是Scooter)来区分我们。不要让这发生在你的代码中。尝试给出与众不同的名称*和*使用名称空间在逻辑上组织它们。 – Amy

回答

2

在ASP.NET MVC/WebApi中,路由从Controller的名称自动确定。因此,如果有两个相同名称的Controller,并且不覆盖RouteAttribute的路线,则它们共享相同的路线。

有两种方法可以解决这个问题:

  1. 使用Areas:区域意味着您的应用程序分成多个MVCS,每个特定部分(由认证/授权规则通常分开)。这看起来像:

    • 公共
      • 控制器
      • 查看
      • 模型
    • 联系
      • 控制器
      • 浏览
      • 模型
  2. 覆盖的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 } 
    ); 
} 

但是,你应该尝试不使用类具有相同的名称,而不考虑命名空间结构。这使得更难识别你正在处理的是什么。

+0

我认为要符合OP的问题,您的示例控制器之一应该是一个'ApiController'。如果启用了属性路由,'Route'将起作用。 – Amy

+0

@Amy我忘记了Web Api 2使用'ApiController'(一段时间以来一直使用ASP.NET Core)。回复更新 –

+1

我预料到会是这样。这里同样的事情。 – Amy