2017-03-06 3 views
0

ルーティング/構造のクリーンアップが必要なWeb API 4.6があります。のは、次のルートの設定を考えてみましょう:ルーティングパラメータをコントローラコンストラクタに渡す方法

public static void Register(HttpConfiguration config) 
{ 
    config.Routes.MapHttpRoute(
      name: "BaseRoute", 
      routeTemplate: "api/{source}/{sourceDocumentName}/{entity}/{projectNumber}/{action}/{outputType}" 
     ); 
} 

私は、コントローラを選択し、コンストラクタに渡されることを支配する{sourceDocumentName}をしたいと思います。したがって、{sourceDocumentName} == "Purchase" || "Order"の場合、RequisitionController(sourceDocumentName)に解決され、そのパラメータがコンストラクタに渡されます。

+0

これを行う必要がある実際の要件は何ですか?どのようにして、ルート値をコントローラのコンストラクタに渡すのに役立ちますか? –

+0

"out of the box" asp.netを使用すると、同じコードで複数のコントローラを作成する必要があります。 'PurchaseController'は' OrderController'と同じです。 – Thor

答えて

1

2つのこと:

  1. なぜそれが実際には、コンストラクタに渡されなければなりませんか?ルート値としては、RouteData.Values経由でいつでもアクセスできます。

  2. 複数のコントローラを使用することはできますが、その多くのロジックが共有されている場合は、ベースコントローラから継承することができます。

+0

1.これは、そのルート値をパラメータとして使用する方法を解決しますが、特定のコントローラにマップするための方法を使用する方法は解決しません。 – Thor

+0

2.私は実際にそれを実際にやっています。基本クラス名の代わりに派生クラス名に解決するために、独自の1行のカスタムルーティングプロバイダを作成する必要があることに注意してください。私がそれに満足していない理由は、私がアクションメソッドのルートを上書きする問題に遭遇したためです。 – Thor

+1

属性ルーティングは考慮しましたか?おそらくあなたの人生は楽になるでしょう。 –

2

本当に分かるのは、Mvcリクエストパイプラインです。要求が到着すると、ルートテーブル、すなわちMvcRouteHandlerが実行され、ControllerFactoryの助けを借りてルートデータに基づいてマッピングされる必要があるコントローラを基本的に初期化するMvcHttpHandlerのインスタンスが取得されます。

本質的にあなたが見ているのは、自分のカスタム実装をIControllerFactoryにして、このリクエストパイプラインを利用できるようにすることです。

+0

何らかの理由で私のカスタムIControllerFactoryが最初のリクエストの後に呼び出されていないので、動作させることができませんでした。そこに出る方法についての例はあまりありませんが(http://www.jomendez.com/2016/01/20/how-to-create-custom-controller-factory-asp-net/)1つです。 – Thor

関連する問題