レガシー 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 を使いたいと思っています。