7

私はデータ アクセス レイヤー (DAL) を実装しています。これは基本的に、データベース (CRUD) 呼び出しを実際に実行するための (VB.NET) 共有関数を持つ一連のクラスです。クラス階層内で DAL への呼び出しを配置するのに最適な場所を見つけようとしています。例を挙げましょう。

標準の ID、Name、Address1 などのプロパティと、オーバーライドされた ToString 関数などを持つクラス Customer があるとします。次のような Shared メソッドを持つ DAL クラスもあります。

(pseudocode)

Namespace Dal

Public Class Customer

Public Shared Function Read(id As Integer) As Customer

Public Shared Function ReadList() As List(Of Customer)

Public Shared Sub Create(c As Customer)

'etc.

これで、次のようにプレゼンテーション レイヤーから Dal を呼び出すことができます。

Me.DataGridView1.Datasource = Dal.Customer.ReadList

ただし、プレゼンテーション層に Dal をまったく認識させるのは良い習慣ではないでしょうか? 代わりに、Customer オブジェクトにメソッドを配置して、このように Dal を呼び出す必要がありますか?

Public Function ReadList() As List(Of Customer)
    Return Dal.Customer.ReadList()
End Sub

Public Sub Create()
    Dal.Customer.Create(Me)
End Sub

これは「よりクリーンな」OOPでしょうか?または、前の例のようにビジネス オブジェクトを渡して、プレゼンテーションに Dal を呼び出させることは許容される方法ですか。

Me.DataGridView1.Datasource = Dal.Customer.ReadList

Dim c As New Customer
c.Name = "Alpha Corporation"
c.Address1 = "123 Main Street"
Dal.Customer.Create(c)

ご意見をいただきありがとうございます。

4

3 に答える 3

2

CRUD操作を別のレイヤーにプルしたい理由は、データベースシステムを変更したい場合に備えてです。さて、それが私がそれをした理由です。良いOODにするためだけにこれを行うことはお勧めしません。しかし、ここに行きます...

クラス/インターフェースのいくつかのセット

BusinessObject-Customerなどのビジネスタイプエンティティを表し、プロパティとしてDataManagerを持ちます。

DataManager-もっと良い名前を思い付くことができるかもしれませんが、これはBusinessObjectsにLoad()関数とSave()関数を提供します

SearchList-物事のリストを返します。SQLクエリはここにあります。また、これはおそらくNext()、Eof()、およびCurrentRecordタイプのメンバーを持つRecordSetのように動作するはずです。

コンストラクタ/ファクトリ-FactoryPatternを参照してください。データベース操作をビジネスオブジェクトから切り離しました。これにより、必要な方法でデータベース操作が再結合されます。適切なdatamanager実装をBusinessObjectに割り当てます

実際の名前を思いつきますが、もう一度顧客について話しましょう。Oracleデータベースがあるとします。あなたはこれらのクラスで終わるかもしれません:

BusinessObjectから継承するboCustomer

DataManagerを継承または実装するoracleDMCustomer

searchlistCustomerは、抽象メソッドを介して、または次のようなインターフェイスとして公開されたsearchlistから継承します。

  • SearchAll()-すべての顧客を返す必要があります
  • SearchByZip(String zip)は、指定された郵便番号を持つすべての顧客を返す必要があります

oracleSearchlistCustomer-searchlistCustomerを実装し、実際にはSearchAll()とSearchByZip()を実装します

boFactory-CreateObject(Type type)のようなメソッドを持つ静的クラス

searchlistFactory-CreateSearchList(Type type);のようなメソッドを持つ静的クラス。

いくつかの空欄を埋めさせていただきますが、重要なものはそこにあると思います。他の人は、より少ない抽象化を必要とする異なるアイデアを持っているかもしれません。1つを使用する前に、いくつかの戦略をモックアップします。

于 2009-02-20T20:03:25.903 に答える