21

クラス名に「Controller」が追加されていない限り、MVCがコントローラーを認識しないのはばかげていると思います。この回答では、この規則が設定されている MVC の 2 つの場所としてControllerDescriptorandについて言及しています。ControllerTypeCache

私の質問はなぜですか?クラスが次のことIsControllerTypeをチェックする場合のように、構成に関する規則ではないことは明らかです。ControllerTypeCache

  • 公開されている
  • 抽象的ではない
  • 実施者IController
  • で終わる"Controller"

誰かがこれの理由を知っていますか? すべてのコントローラが実際の MVC プロジェクトの「Controllers」という名前のフォルダにある可能性が高い後、ファイルをダブルクリックするだけで、クラスが継承していることがわかりますController

私にはばかげているように思えますが、彼らがこれを行った実際の理由があるかどうか疑問に思っていました.

編集

昨日の Phil Haack によるこのブログ投稿を見たところ、彼はこの大会の決定について議論しています - 彼は私と同じ考えです - おそらく少し無意味です!

4

3 に答える 3

16

カスタム コントローラ ファクトリ

これらのクラスを異なる方法で解決するカスタム コントローラー ファクトリをいつでも提供できます。そして、コントローラーはコントローラーの型名を追加する必要がないことに同意します。結局のところ、コントローラーは他のクラスとまったく同じだからです。いずれにせよ、それらの OOP 祖先型はそれらをコントローラーとして定義します ( IController, Controller...)

ビジュアルスタジオかな?

Visual Studioと関係があるかもしれませんが。属性クラスに似ています。おそらく、Visual Studio はControllerで終わらないクラスに追加のコンテキスト メニュー項目を提供しないでしょう。コントローラーのアクションを実行しているときは、一致するビューに簡単に移動 (または作成) できます。

コンベンションは良い

専門家と私は同意します。.net フレームワークにもこれらのような他の規則がありますが、人々はそれらについて文句を言いません。

collectiondictionariesattributeslist、および同様の接尾辞を特に理由なく使用するその他の型について考えてみてください。どちらの方法でも機能しますが、どのように機能し、いつ使用するかを本能的に知っているユーザー (開発者) は、はるかに簡単に認識できます。

Asp.net MVC チームによるタイプの衝突

アプリケーション モデルのエンティティ インスタンスProductControllerを処理する可能性が高い があると想像してください。コントローラーProductの命名規則がないため、同じ名前の 2 つの型が存在するため、2 つを区別するために常に名前空間を提供する必要があります。しかし、この規則があるため、これは必要なく、型の衝突は発生しません。

public class ProductController : Controller
{
    public ActionResult Index()
    {
        // we'd have to distinguish this Product type here
        IEnumerable<Product> result = GetProducts();
        return View(result);
    }
    ...
}
于 2012-07-19T09:27:19.220 に答える
0

最初の 2 つは、mvc がコントローラーをインスタンス化できるようにするために必要です。3 番目は、mvc がコントローラーの使用方法 (Executeメソッドを呼び出すため) を知るために必要です。4 番目は、単に型をより速く見つけるためだと思います。

于 2012-07-19T09:16:59.707 に答える
0

はい、慣習は良いですが、これは慣習の問題ではないと思います。使用しているパターンのソリューション ドメインから適切な名前を選択することが重要です。

たとえば、製品を扱う UX にリストが含まれる場合は、単純にコントローラーの ProductList を呼び出すことができ、List と混同する必要はありません。人間として、私たちはコンテキストに基づいて毎日簡単にあいまいさを解消しており、ソフトウェアでのネーミングも例外ではありません。ここで、コントローラーの役割は調整することです。弊社ProductListの場合。ProductList.sort(byField)、ProductList.delete(product) などのアクションを調整します。

構成よりも規則の概念を利用する限り、メタレベルでそれを行うことができます。.Net では、属性を使用してコントローラーまたはモデルを識別できます。

大したことは何ですか?名前にパターンを記載すると、怠惰な命名が行われ、怠惰なモデリングが行われます。名前は単なる名前ではなく、ソリューション ドメインをモデル化するために使用している概念を選択します。その意味は、その概念を表すコードと、そのコードが結合されている他のコードを決定します。名前が一般的かつ/またはあいまいであるほど、保守が困難な方法で設計を拡張および変更する必要が生じます。

于 2014-09-26T05:41:49.247 に答える