2

開発中の新しいシステムで、よりオブジェクト指向のASP.NET Web アプリケーションへのアプローチに切り替えています。

私は、ほとんどの人がよく知っている共通の構造を持っています。私は複数の学部がある学校構造を持っています。単一の部門に属するコース。および複数のコースに所属する学生。

部門ビューでは、部門に属するすべてのコースを一覧表示し、入学数、退学数、男性/女性数など、各コースの集計値が必要です。

ただし、個々のコースビューでは、学生の実際のリストと、学生が在籍しているかどうか、コースに合格したかどうか、性別などの詳細が必要です。

次に、他のコースへの登録、住所など、学生に関するすべての詳細が表示される個々の学生ビュー。

以前は、それぞれの場合に必要なデータを返すデータ アクセス レイヤーがあり、それをSQLDataReaderorとして返していましたDataSet(VB.NET で動作)。今、私はオブジェクト指向のアプローチでこれをモデル化しようとしています.DALでオブジェクトを作成し、これらをBLLに返します. オブジェクトに集約された詳細が必要な場合でも、これを処理する方法がわかりません。たとえば、コースのリストを含む部門ビューには、各コースの集計があります。いくつかの軽量コース オブジェクトのコレクションを、それらの軽量コース オブジェクトが集計値を格納する部門に格納しますか?

さまざまなシナリオで必要な抽象化のレベルが異なると思いますが、これを処理する最善の方法はわかりません。集計を格納する非常に基本的なコース オブジェクトと、完全な詳細を格納する子オブジェクトがあるオブジェクト モデルを使用する必要がありますか?

また、これらの種類のものをモデル化する方法を理解するのに役立つ有用なリソースがあれば、それは素晴らしいことです.

4

4 に答える 4

4

物事を過度に複雑にしたり、不必要な作業を行ったりしないでください。データベースはデータ操作に関して完璧なので、集計は DB に任せましょう。コード側では、オブジェクト モデルにもう 1 つのオブジェクトを追加すると、うまくいきます。

class CourseStats
    string Name { get; }
    int Enrollments { get; }
    int Withdrawals { get; }

集計を行うための SQL は非常に簡単です。ただし、必ず ORM ( NHibernateを考えてください) またはあまり洗練されていない Result-Set Mapper ( BLToolkitを考えてください) を使用してください: これらのオブジェクトを手動でハイドレートしたくはありません。

追加の利点は、両方のクエリ結果をキャッシュできることです (そして、コース関連の何かが変更されるとすぐにキャッシュを無効にします)。

于 2009-10-08T09:08:34.253 に答える
1

これは実際、多くの人が苦労しているかなり大きな問題です。

私が特定できた限り、この問題には少なくとも 2 つの考え方があります。

  • 遅延読み込みをサポートする OR/M を使用した永続的無視ドメイン オブジェクト
  • ドメイン駆動設計と明示的にモデル化された (および明示的に読み込まれた) 集計

Jeremy Miller は、いくつかの持続性パターンを調査する記事を MSDN Magazineに掲載しています。

Domain-Driven Designという本には、Aggregates のモデル化に関する良い議論があります。

于 2009-10-08T09:10:36.503 に答える
0

.NET を使用している場合に調査すべきことの 1 つは、LINQ to SQLです。これにより、DAL への非常に洗練されたインターフェイスを持つことができます。LINQ を使用すると、BLL で集計クエリを作成できるため、ソース全体に広がる厄介な SQL スニペットだけでなく、配管コードも節約できます。LINQ で表現された集計 SQL クエリの前のリンクの例:

var averageOrderTotals =
  customers.
  Select(c => new {
      c.Name,
      AverageOrderTotal = c.Orders.Average(o => o.Total)
   });

データベース層を LINQ に切り替えましたが、私の場合は MS SQL Server を使用していないため、代わりにDbLinqライブラリを使用しました。

最も避けたいことは、データベース アクセス レイヤーに対応するためにクラスを変更することです。そのようなアプローチを行うと、ソリューションが非常に壊れやすくなります。

于 2009-10-08T09:21:27.770 に答える
0

部門が少なく、それぞれのコースの数が少ない場合は、すべてをロードして、オブジェクトに計算を行わせます (つまり、部門はコースのリストを繰り返し処理し、必要なものを合計するだけです)。

別のアプローチは、カスタムのネイティブ SQL を使用して、データベースに対して合計を実行することです。これは DAL で非表示にできます。次に、DAL は、たとえば仮想コース (データベースには存在しないが合計を含む) を返します。

3 番目のアプローチは、これらの値を部門オブジェクトのどこかに保持し、コースが変更/追加/削除されるたびに更新することです。

于 2009-10-08T09:09:05.197 に答える