web-dev-qa-db-ja.com

データアクセス層内のビジネスオブジェクト

そのため、私はTDDを介してデータアクセスレイヤーを作成しており、ある程度の懸念に取り組みました。私は間違った道をたどるのではなく、私の考えがきれいなアーキテクチャと一致しているかどうかを皆さんに尋ねるように依頼したと思いました。

データアクセスレイヤー(略してDAL)内のメソッドは非常に単純です。それらはデータベース内のストアドプロシージャと一致しており(物事をきれいに保つために他の方法で呼び出すことはありません)、プロシージャと同じパラメーターが含まれています。次に、データベースに接続し、クエリ結果を返します。以下はその一例です。

_public int DeleteRecord(int recordId)
{
    recordId.RequireThat("recordId").NotZeroOrLess();

    List<SqlParameter> parameters = new List<SqlParameter>();
    parameters.Add(new SqlParameter { ParameterName = "@RecordId", SqlDbType = SqlDbType.Int, Direction = ParameterDirection.Input, Value = recordId});

    return this.ExecuteNonQuery("DeleteRecord", parameters.ToArray());
}
_

結果セットで意味のあることを何もしていないので、これはこのタイプのメソッドに完全に機能します。コマンドが機能することを確認したいだけなので、影響を受けた行のみである非クエリの結果を返し、その番号を使用してロジックを確認できます。

ただし、別のDALメソッドで、レコードをロードしたいとします。ロード手順では、一連のテーブルに対してselectsを実行してDataSetを返しますが、DataSetor私のビジネスオブジェクト自体が、DALからDataSetを取得し、基本的に自分自身を埋めるLoad()メソッドのみを持つ必要がある場合.

DALを介して実行すると、ビジネスオブジェクトのロジックは少なくなります(これは単なる選択ロジックですが、それでもロジックです)が、DALを少し混雑させて、本来あるべきことを実行していないように感じますやっている。

皆さんはどう思いますか?

12
user44797

DALはデータオブジェクトを返す必要があります

理想的には、DALは「ブラックボックス」オブジェクトである必要があり、アプリケーションコードはデータオブジェクトを要求したり、既存のデータオブジェクトを操作したりするために使用できます。 DALとアプリケーションコードの間にRepositoryと呼ばれる別のレイヤーが存在する場合があります。これは、2つのレイヤーをさらに分離しますが、これは必ずしも必要ではありません。

また、通常、ビジネスオブジェクトが自分で作成できるようにする必要はありません。これは、誰かがライブラリを使用し、.Load(someId)を呼び出すことによってオブジェクトの新しいインスタンスを作成するセキュリティホールを引き起こす可能性があり、完全に分離されている2つのレイヤーをマージします。

データセットの定義が変更された場合、そのデータセットを使用するデータオブジェクトを探し出して変更する必要があるため、a.Load(DataSet ds)メソッドを提供することもお勧めしません。すべてのデータアクセスコードを1か所に保持する方が簡単なので、データアクセスクエリを変更した場合は、DALレイヤーを変更するだけで済みます。

4
Rachel

私の方法は、LINQ-To-SQLとEntity Frameworkの前でも、アプリの異なるレイヤー間の通信のための「書面によるコントラクト」を提供するインターフェイスと抽象クラスライブラリを用意することでした。これは オントロジー と呼ばれることもあり、作業ドメインの定義です。レイヤー間を通過するものはすべてこの「契約」を使用しました。

生のDatasetオブジェクトをデータレイヤーからビジネスレイヤーに渡すという考えは好きではありません。これは、特にレガシーデータソースを統合する場合に、多くの問題を引き起こします。また、プロジェクトに参加する新しい人々がデータの出所を理解するのが非常に困難になる場合もあります。最後に、それはあなたのビジネス層がDBから直接データを処理するビジネスにあることを必要とし、それは将来の複雑化につながる可能性があります。

あなたが持っていたサンプルコードは、LINQ以前のコードに似ています。 DALオブジェクト内で使用する共通のDB関数クラスがありました。 DALクラスはデータを読み取り、それを「契約」オブジェクトに適合させます。削除の例のようなスカラー結果は、通常はブール値である値を返します。

2
jfrankcarr

DALはデータセットを返す必要があります。返されるデータセットはビジネスオブジェクトである必要があります。期待されるデータが含まれていることを確認する以外に、何もする必要はありません。それをさらに実行する必要がある場合は、単一のストアドプロシージャでやりすぎているか、またはストアドプロシージャでデータを適切に返さないようにしています。

0
Ryathal

ビジネスオブジェクトには、結果セットからデータを取り込むコンストラクターを用意することをお勧めします。これにより、DALとビジネスレイヤーの間の結合が削除されます。 2つを完全に分離する場合は、結果セットから列名=>値のペアの単純なマップを作成し、それをコンストラクターに渡します。

0
TMN