ビジネスレイヤーとデータアクセスレイヤー間でデータを渡す-不正なコードですか?
-
10-07-2019 - |
質問
JCPropertyクラス内で次のコードを使用して、DALからデータを取得しています:
Dim x As JCProperty
x = JCPropertyDB.GetProperty(PropertyID)
If Not x Is Nothing Then
Me.PropertyID = x.PropertyID
Me.AddressLine1 = x.AddressLine1
Me.AddressLine2 = x.AddressLine2
Me.AddressLine3 = x.AddressLine3
Me.AddressCity = x.AddressCity
Me.AddressCounty = x.AddressCounty
Me.AddressPostcode = x.AddressPostcode
Me.TelNo = x.TelNo
Me.UpdatedOn = x.UpdatedOn
Me.CreatedOn = x.CreatedOn
Me.Description = x.Description
Me.GUID = x.GUID
End If
これは正常に機能しますが、DALオブジェクト(JCPropertyDB)がビジネスオブジェクト(JCProperty)を認識している必要があり、同じオブジェクトを2回(DALでBLに戻ってBL内に戻るために)効果的に作成および移植します自身を移植するオブジェクト)。
ここに何かがありません。もっと良い方法があるはずです!
事実上、許可されていない「Me = x」を割り当てる必要があります。誰かが私をまっすぐにすることができますか?
解決
個人的に、私は怠け者です。私は通常次のようなことをします:
class JCProperty : inherits JCPropertyDB
{
New()
{
MyBase.New()
GetProperty(PropertyID)
}
}
その後、JCPropertyクラスに「最上部」で発生する必要がある追加機能があるまで、基本的に完了です。 JCPropertyDBにすでに存在する機能の一部。次に、JCPropertyDBメソッドをオーバーライドして、最初に基本メソッドを呼び出してから、新しい機能を追加します。
ロン
他のヒント
右側の行にいますが、1ポイントがわずかに欠落しています。
通常、データアクセスレイヤー(DAL)はデータ転送オブジェクト(DTO)を返します。データベースから。これらは、ビジネスロジックを含まないプレーンオールドCLRオブジェクト(POCO)であり、単にデータベーステーブルへのマッピングを多かれ少なかれプロパティにしています。
その後、これらのDTOからドメインモデルを作成するコードが作成されます。 データマッパー。ドメインモデルのクラスは類似した名前(つまり、CustomerDTO-> Customer)を持っている場合がありますが、データに加えて、検証ルールと他のビジネスロジックが含まれている可能性があります。
実際のDTOではなく、ビジネス層で使用するのはこのドメインモデルです。つまり、DALから返されたDTOを変更する場合(つまり、新しいORMツールを実装する場合)、データモデルが同じままであればデータマッパーを変更するだけで済みます。
データアクセスパターンについては、マーティンファウラーのエンタープライズアプリケーションアーキテクチャのパターンを参照することをお勧めします。
これがあなたの質問に答えるかどうかはわかりませんが、重要な点は、ドメインモデルが表示とストレージに依存しないことです。これは多くの場合、関心の分離として示されます。アイデアは、疎結合を取得し、オブジェクトがいくつかの完全に異なる責任を持たない単純なシステムを作成することです。
したがって、私がやることは、DALがビジネスオブジェクトを直接作成できるようにすることですが、ビジネスオブジェクトをDALに関連するもので汚染しないようにしてください。同様に、HTMLのようなUI固有のものでそれらを汚染したくありません。
私の意見では、ビジネスレイヤー、DAL、およびUIレイヤーの両方がドメインモデルに依存していることは問題ありませんが、ドメインモデルと他のコンポーネントに依存していることは問題ありません。
カップリングを緩めるには、Springなどの依存性注入コンテナーをインターフェイスと配線と共に使用すると役立ちます。
すべてのレイヤーで同じオブジェクトを再作成することにより、DRY原則に違反し(繰り返さないでください)、ボイラープレートコードを導入し、どこかでエラーを導入する可能性を高めます。
BOを取り込み、ブリッジパターンとプロバイダーモデルを介してDALからBOを送り返してきました。大量のシリアル化(WebサービスやJSONなど)を恐れない限り、DTOの要点はわかりません。私のアプローチは、インターフェースを介してデータ層とビジネス層を抽象化し、ビジネスオブジェクトに供給される匿名データ層を提供することでした。つまり、任意のデータ層をプラグインし、ユニバーサルのLoadメソッドとSaveメソッドを備えたインターフェイスを実装し、ドメインレイヤーを介してアクセスできます。 BLにはDALコードはありません-提供され抽象化されたデータ層への呼び出しです。データレイヤーへの呼び出しは、プロバイダーパターン(直接参照なし)で管理されており、単純に実行します。
public class Person : IBusinessObject<Person>
{
protected IDataLayer<T> dataLayer;
Person Load() { this.dataLayer.Load(this); }
}
私が持っているデータ層で...
public class PersonMapper : IDataLayer<Person>
{
Person Load(Person person) {
...get DB stuff...map to person...decorate object...
return person;
}
}
これが良いかどうかはまだわかりませんが、私にとってはうまく機能します。リフレクションを使用して、ネストされたオブジェクトの遅延ロードも取得できました。