2017-09-13 20 views
-3

名前空間による差別化は、第三者図書館がある場合にのみ使用し、私たちが自分で書くクラスを区別することは避けてください。C#と名前空間

Web Apiでは、コントローラ名とアクション名が同じだが名前空間が異なると、ルーティングが行われず404エラーが発生します。私はカスタムコントローラセレクタがこれを克服するために使用できることを知っていましたが、組み込みセレクタがそれを無視するので、意図的な設計の決定であるかどうか疑問です。名前空間だけで差別化を避けるべき理由はありますか?

+2

はい、同じ名前のものは(人間によって)混同される傾向があります。 – Amy

+0

同じことを言っているが、異なる名前空間にある2つのもの(コントローラなど)が@JohnLの場合の**利点**についてお話できますか? – mjwills

+3

私の最初の仕事のひとつで、私は3人の他のエイミーと一緒に仕事をしました。 PAシステム上で電話がかかってくると、私たち全員がフロントデスクに現れます。最終的に私たちは私たちを差別化するニックネーム(私はスクーターでした)を与えました。これがあなたのコードに起こらないようにしてください。物事に特有の名前をつけて*名前空間を使ってそれらを論理的に整理してみてください。 – Amy

答えて

2

ASP.NET MVC/WebApiでは、ルートはControllerの名前から自動的に決定されます。したがって、同じ名前の2つのControllerがあり、RouteAttributeのルートを上書きしない場合、それらは同じルートを共有します。

は、あなたがこの問題を解決することができる2つの方法があります。

  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の質問に合っていると思う、あなたのサンプルコントローラの1つは 'ApiController'でなければなりません。属性ルーティングが有効な場合、 'Route'が動作します。 – Amy

+0

@Amy Web Api 2が 'ApiController'を使用していることを忘れていました(ASP.NET Coreを使用していました)。回答が更新されました –

+1

私はそうであると予想しました。同じことがここにあります。 – Amy