7

レガシー Web アプリケーションを (ゼロから) 書き直す目的で、ASP.NET アプリケーションと Database-Abstraction-Layers の構造について、数か月にわたっていくつかの質問を投稿しました。私は最近、MVC3/Entity-Code-First に出くわし、しばらく使ってみたところ、その仕組み、物事がどのように抽象化されているかに惚れ込み、それを使用する言い訳を探しています!

従来のアプリケーションは、独自の HTML を生成する C++/CLI Windows サービスであり (CSS は色とテーブルが豊富に使用されているだけの非常に古い学校の HTML)、ビジネス ロジックに非常に緊密に結合されたインターフェイスを備えています。基本的に何でも改善されます。

しかし、おそらくこれは、私がまだ MVC に十分な時間を費やしていないためかもしれません。

  • レガシ アプリは、カスタム コントロール (独自のフォーム) を使用してコンボ ボックスをデータにバインドし、別の選択に基づいて依存するコンボ ボックスを動的に再設定します。ASP.NET では、この質問は簡単に答えられます。asp:DataListコントロールをページに配置し、それをデータ ソースにバインドすると出来上がりです。少し単純なコードを使用すると、選択した値で他のコンボ ボックスをフィルター処理できます。また、ASP.NET では、従属データをこの方法で自動化する別のデータ リストを実装することも簡単です (これにより、従来のアプリの動作が非常にうまく模倣されます)。MVC でカスタム コントロールの概念を見つけることができないようですが、この種のものはデータを取得してコンボ ボックスに投入するための jQuery 呼び出しによって処理されると思います。しかし、これはコンボボックスがあるすべてのページのすべてのコンボボックスに対して行われますか? これは、適切なパラメーターが渡された部分ビューの場合ですか、それとも単にばかげていますか?

  • これは MVC よりも Entity Framework に関連していると思いますが、Web やチュートリアルで見つけたほとんどの例では、LINQ クエリを実行して、表示するオブジェクトのコレクションを返します。たとえば、MvcMovie の例から:

    public ActionResult Index()
    {
        var movies = from m in db.Movies
                     where m.ReleaseDate > new DateTime(1984, 6, 1)
                     select m;
    
        return View(movies.ToList());
    }
    

    次に、を使用してレンダリングされます@foreachビューでループします。これはすべて素晴らしいです。レガシ アプリケーションには、システムの他のすべての領域 (50 以上あります) で使用される単一の参照ページがあります。これは、ログオンしたユーザーに対して定義された列の順序を検査し、外部キーを平坦化することによってこれを行います (ユーザーフレンドリーでない主キー値とは対照的に、外部テーブルのフィールドが表示されるように)。カスタムフィルターを任意の列に。これは、10 万行以上のテーブルに対しても行われます。Entity-framework とビューを使用して同様のものを作成するにはどうすればよいでしょうか? ASP.NET では、ある種のグリッド ビューを動的に生成し、列を自動生成してフィルターを適用することで、おそらくこれを解決します。これは、MVCでより多くの作業を行う可能性があるようです。何か不足していますか?

  • レガシ アプリケーションには、大量のデータ セットを処理する操作がいくつかあります。これはサービスであるため、シャットダウンされることを心配することなくこれらのスレッドを起動できました。SO に関する私の質問の 1 つは、静的マネージャーの存在と AppPool リサイクルの導入についてでしたが、補助サービスを使用することは良い選択肢であると判断しました。つまり、レガシ アプリは、更新ステートメントを単一の行ではなく、レコードの大規模なグループに適用します。これは、通常のモデルをバイパスするデータベースに対してカスタム SQL を記述せずに Entity-Framework で可能ですか? このようなことをする必要がないことを願っています(そうする必要はありません。これは単なる例です)

    var records = from rec in myTable
                  where someField = someValue
                  select rec;
    foreach(rec in records)
        rec.applyCalculation();
    db.SaveDbChanges();
    

    これにはかなりの時間がかかる可能性があると思いますが、従来のアプリでは次のようにするだけです。

    UPDATE myTable
    SET field1 = calc
    WHERE someField = someValue
    

    したがって、この方法でモデルをどのように使用するかは、私には完全には明らかではありません.

  • レガシ アプリケーションのレイアウトには、どのページでも使用できるいくつかのデータ パネルがあります。ここ Stackoverflow を見ると、この質問が見つかりました。これは、すべてのビューがこの情報をレイアウトに渡す必要があることを意味しますか? そうですか、それとももっと良い方法はありますか?理想的には、レイアウトで特定のモデル/リポジトリにアクセスし、サイド パネルにデータを表示できるようにしたいと考えています。すべてのビュー ページへの追加は非常に反復的であり、エラーが発生しやすい可能性があります。何かを変更する必要がある場合にかかる時間は言うまでもありません。ここでは部分ビューで十分ですが、レイアウト ページでモデルを渡す方法がわかりません。

  • 最後に、Ef-Code-First をインストールした後、本当に素晴らしい属性SourceNameがまだ入っていないことを知り、がっかりしました。これは、従来のテーブル/列に対するマッピングに非常に適していますが、なぜこの時点で除外されたのか完全にはわかりません (少なくとも、私のインテリセンスはそれが存在しないと言っています!) しばらくはなくても大丈夫でしたが、最終的には非常に便利です。

長い質問で申し訳ありません。ASP.NET と MVC3 で何年にもわたる調査作業を行った後、私は本当に MVC3 を使いたいと思っています。

4

2 に答える 2

3

質問を正しく抽出できた場合、これが私の返信になります。

  1. マスター - 詳細ドロップダウン (またはその他のコントロール) についてのあなたの考えは正しいです。jQuery AJAX/JSON 呼び出し (主に GET) が必要になります。ページにドロップダウンが 1 つしかない場合は、もちろん、そのような対話機能は必要ありません。コントローラー アクションでモデルを準備するだけで済みます (SelectList オブジェクトを作成します)。

  2. ここでは、jqGrid や Flexigrid などの何らかのグリッド システムを使用することになる可能性が最も高いでしょう。彼らは、フィルタリング/検索/クエリに関するほとんどのことを自分自身で行います。それでも、データを提供する JSON コントローラー アクションを提供する必要があります。

  3. はい、EF 経由で SQL を実行できます。とがありExecuteStoreQuery()ますExecuteStoreCommand()。これらについて詳しくは、http://msdn.microsoft.com/en-us/library/ee358769.aspxをご覧ください。

  4. ビューから呼び出しRenderAction()て、このアクションでオンデマンドでデータを準備し (呼び出すたびに)、部分 (または通常の) ビューをレンダリングして、データ (モデル) をフィードすることができます。RenderPartial()は、これに関しては少し不器用です。呼び出しているビューで、モデルが既に使用可能になっている必要がありますRenderPartial()RenderPartial()コントローラー アクションに戻ることはありません。ビュー内からの呼び出しで指定したモデルを使用して、テンプレートで定義された HTML をレンダリングするだけです。

  5. 残念ながら、これに対する答えはわかりません。

HTH

于 2011-01-30T01:02:57.697 に答える
1

気に入らないかもしれませんが、c++アプリケーションをリファクタリングする方がはるかに理にかなっています。特にビジネスに。HTMLの生成に問題はありません。テンプレートのセットよりも、最新のhtml/cssにリファクタリングする方がはるかに簡単です。

于 2011-02-07T23:42:31.467 に答える