このように階層化された基幹業務アプリケーションがあった場合、これは適切な分業でしょうか。
データアクセス
ストアド プロシージャのみを呼び出し、 DTOのプロパティをハッシュ テーブルにマップします。ハッシュ テーブルは、ADO.NET コマンドのパラメーター コレクションを設定するために使用されます。
SqlDataClient を参照するアセンブリのみ。
- マッピングコードで空白、null、および空を意味するものを扱う重要なロジックですが、それ以外の場合は検証やその他のドメイン固有のロジックはありません。
いわゆるビジネスロジック
複数の結果セットを個々の DataTable に分割します。
public void ReturnNthRecordSetFromStoredProcFoo()
データセットのデータアクセスへのパススルー。
public void ReturnDataSet(string name){ return (new PersonController).GetAnotherDataSet(name);}
DataTable の 1 行を 1 つのDTOにマップします
- マッピング コードで空白、null、および空を意味するものを扱う重要なロジック。
- 単一のストアド プロシージャ呼び出しをラップするためにのみ使用されますが、トランザクション オブジェクトを保持します。
- SqlDataClient への参照がないため、SqlDataReaders を使用して DTO を埋めることはできません
- System.Web.UI への参照なし
- 承認規則、それ以外のドメイン固有のロジックはありません。
UI
- ASP.NET フォームへの DTO の双方向データ バインディング。
- コントロールのプロパティの検証 - 通常、DTO に対して直接検証を行うことはありません
- 「コレクション」は、DataSet をグリッドにバインドすることによってナビゲートされます。実際、コレクションで何かをしようとすると、UI が DataTables の DataRows を反復処理し、適切な列名が何であるかを知る必要があります (通常、DTO に似ているだけです)。
最後に質問ですが、このアプリケーションでは、データ アクセス レイヤーは、いわゆるビジネス レイヤーの役割を引き受けるべきでしょうか? これは、余分なアセンブリの不都合を除けば、すでに 2 層 (ほぼ 1 層!) のアプリケーションではありませんか?
追加情報: わかりました。アプリケーション サーバーは、ユーザー数の少ないイントラネット アプリであるため、おそらく永遠に 1 台のマシンであることがわかっています。したがって、物理的に分離されたアプリケーション層を設計するべきではないことを私は知っています。また、おそらく 1 つの UI のみをサポートし、ASP.NET 以外のものをサポートする必要がある場合は完全に破棄されます。これは、層/レイヤーのもう 1 つの理由としてよく引用されます。