8

従来の Web フォーム アプリケーションをまったく新しい MVC アプリケーションに拡張/変換しています。この拡張は、テクノロジーとビジネス ユース ケースの両方の観点からです。レガシー アプリケーションは、よくできたデータベース駆動型設計 (DBDD) です。たとえば、オペレーター、スーパーバイザー、店主などのさまざまなタイプの従業員がいて、新しいタイプを追加する必要がある場合、いくつかのテーブルに行を追加するだけで、UI に追加するすべてのものが自動的に表示されます。新しいタイプの従業員を更新します。ただし、層の分離はあまり良くありません。

新しいプロジェクトには主に 2 つの目標があります

  • 拡張性 (現在および将来のパイプライン要件に対応)
  • パフォーマンス

拡張性の要件を念頭に置いて、データベース駆動設計 (DBDD) をドメイン駆動設計 (DDD) に置き換える新しいプロジェクトを作成するつもりです。ただし、データベース駆動設計からドメイン駆動設計への移行は、従来の DBDD アプリケーションのパフォーマンスと比較すると、パフォーマンス要件に逆の影響を与えるようです。従来のアプリケーションでは、UI からのデータの呼び出しはデータベースと直接対話し、データは DataReader または (場合によっては) DataSet の形式で返されます。

厳密な DDD が導入された今、データの呼び出しはビジネス レイヤーとデータ アクセス レイヤーを経由してルーティングされます。これは、各呼び出しがビジネス オブジェクトとデータ アクセス オブジェクトを初期化することを意味します。1 つの UI ページがさまざまな種類のデータを必要とする場合があり、これは Web アプリケーションであるため、各ページは複数のユーザーによって要求される可能性があります。また、MVC Web アプリケーションはステートレスであるため、要求ごとにビジネス オブジェクトとデータ アクセス オブジェクトを毎回初期化する必要があります。したがって、MVC ステートレス アプリケーションの場合、DBDD は DDD よりもパフォーマンスが優れているようです。

または、DDD が提供する拡張性と DBDD が提供するパフォーマンスの両方を達成する方法が DDD にあるのでしょうか?

4

3 に答える 3

6

更新がドメイン モデルを介して行われ、読み取りが DataReaders として行われる、何らかの形式のコマンド クエリ分離を検討しましたか? 本格的な DDD が常に適切であるとは限りません。

于 2012-05-21T12:05:51.057 に答える
4

「現在、厳密な DDD が導入されているため、データの呼び出しはすべて、ビジネス レイヤーとデータ アクセス レイヤーを介してルーティングされます。」

私はこれが真実だとは信じていませんし、実際的ではないことは確かです。これは次のように読むべきだと思います:

厳密な DDD が導入された今、トランザクションのすべての呼び出しは、ビジネス レイヤーとデータ アクセス レイヤーを経由してルーティングされます。

画面に表示する必要のあるデータを取得するために、データ アクセス層を直接呼び出すことができないということはありません。動作に基づいて設計されたドメイン モデルを呼び出す必要があるのは、データを修正する必要がある場合のみです。私の意見では、これは重要な違いです。ドメイン モデルを介してすべてをルーティングすると、次の 3 つの問題が発生します。

  1. 時間 - 機能を実装するのに非常に長い時間がかかりますが、メリットはありません。
  2. モデルの設計 - ドメイン モデルは、動作ではなくクエリのニーズを満たすために形が崩れます。
  3. パフォーマンス - 追加のレイヤーが原因ではなく、クエリから直接取得できるほど迅速にモデルから集計データを取得できないためです。つまり、特定の顧客に対して行われたすべての注文の合計値を考えてみましょう。顧客のすべての注文エンティティを取得し、反復して合計するよりも、クエリを作成する方がはるかに高速です。

Chriseyre2000 が述べたように、CQRS はまさにこれらの問題を解決することを目指しています。

于 2012-05-25T10:51:16.400 に答える
1

DDD を使用しても、シナリオのパフォーマンスに大きな影響はありません。あなたが心配しているのは、データアクセスの問題のようです。あなたはそれを次のように参照します

ビジネス オブジェクトとデータ アクセス オブジェクトを初期化する

「初期化」が高価なのはなぜですか? どのようなデータ アクセス メカニズムを使用していますか?

リレーショナル データベースに格納された有効期間の長いオブジェクトを使用する DDD は、通常、ORM を使用して実装されます。適切に使用すれば、ORM がほとんどのアプリケーションのパフォーマンスに与える影響は、たとえあったとしてもごくわずかです。また、ボトルネックが証明されている場合は、アプリの最もパフォーマンスが重要な部分をいつでも元の SQL に戻すことができます。

価値があるのは、NHibernate をアプリケーションの起動時に 1 回初期化するだけでよく、その後は通常のデータ リーダーと同じ ADO.NET 接続プールを使用することです。つまり、適切なマッピング、フェッチ戦略、および「n+1 選択」などの古典的なデータ アクセスの間違いを回避することです。

于 2012-05-23T03:51:10.000 に答える