2009-04-06 25 views
9

MapRoute拡張に 'namespace'という文字列[]パラメータを受け入れるオーバーロードが含まれていることに気づきました。私はGoogleが私に持っていたものを読んでいたと思います。これはおそらく、フレームワークが他の方法で見ていない場所でコントローラを見つけるのを助けることでしょう。ASP.Net MVC Controller名前空間配列

私はいくつかのスパイクを行い、コントローラを変な場所に置こうとしました。私はScriptsフォルダに1つ入れます。私は独立したルート名前空間を持つ別のアセンブリでも構築しました。

名前空間のパラメータにanytingを入れないと、すべて正常に機能しました。名前空間の1つを名前空間のparamに入れても、それでも私のすべてのコントローラが見つかりました。同様の名前のコントローラーの間の曖昧さを排除するために、この配列を使用すると思ったかもしれませんが、それも起こりませんでした。 MyContj.Controllers内のHomeControllerとSomeOtherName.Stuff内のHomeControllerはまだ衝突します。

私の質問は、そのパラメータは推奨されていませんか?それとも、私はまだ分かっていない方法で何とか使われていますか?

答えて

5

これで、さらにテストしたところ、フィルタではないことが分かりましたが、まあまあです。あなたが部分的に間違っていても私はあなたに「答え」クレジットを与えました。

結局のところ、私はそれが曖昧さを言っているはずだと思ったように行動します。基本的に、論理的な流れは次のようなものである:名前空間アレーことが見つかった場合

  • の1に一致する_CACHEで名前空間の

    • 見て、右の名前のコントローラを探し
    • - それが見つかった場合は、
    • それを返す - それが見つからない場合は、それが見つからない場合は、すべての検索それは通常
  • を見るだろうと他のどこでも検索戻りますどこlese

したがって、要するに、名前空間の配列が明確にするのに役立つだろうと私は考えました。その点に関する私の最初のテストが失敗したのは、完璧なマッチだけであり、アセンブリのルートn/s(つまり、MyRoot.ControllersではなくMyRoot)を間違えたからです。

この名前空間で許可されているものは、2つの異なる名前空間にHomeControllerを持ち、URLまたはparamsに応じて異なるものにします。

4

いいえ、値は推奨されていません。 DefaultControllerFactory.csで使用されます。値を指定すると、検索された標準の名前空間が完全に置き換えられます。パラメータが供給されていない場合、名前空間は、当社の決定を検索:パラメータが供給されると

HashSet<string> nsDefaults = new HashSet<string>(ControllerBuilder.DefaultNamespaces, StringComparer.OrdinalIgnoreCase); 

、あなたが提供するリストは、この値を置き換えます。

は、いずれの場合も、DefaultControllerFactoryコール:

GetControllerTypeWithinNamespaces(controllerName, nsDefaults); 

を...リストで、付属の1、またはデフォルトのいずれか。その値がサポートされていることは明らかです。

ソースコードを参照してControllerTypeCacheを見ると、名前空間の値の実際の目的がわかります。コントローラーファクトリが見た目には見えない場所を探すことはありません。むしろです。です。言い換えれば、デフォルトのコントローラファクトリが見えなくなり、そうでなければコントローラを検索することを防ぐことができます。

+0

私はそれがうまくいくと思います。DefaultControllerFactoryで説明しているのと同じ場所を見つけましたが、上記のテストを実行すると、それはうまくいかなかったのです。 存在しなかった名前空間を提供しましたが、工場は引き続きコントローラを検出しました。 – Paul

+0

ControllerTypeCacheのコードは、私にとってはうまくいくように見えます。ソースを使ってビルドすることで、デバッグすることができます。おそらくあなたが提供していないものがありますか? –

+0

私はそれがそのように見えることに同意し、以前にテストするときにソースを作成しました。私はいくつかの異なるパラメータで再度試してみます。 – Paul