ビジネス オブジェクトを設計するとき、データ アクセス層を作成するさまざまな方法を試しました。いくつかは他のものよりもうまくいきましたが、私はいつも「より良い」方法がなければならないと感じていました.
人々がさまざまな状況で DAL を処理したさまざまな方法と、この手法がどのように機能したか、またはうまく機能しなかったかについての意見を知りたいだけです。
ビジネス オブジェクトを設計するとき、データ アクセス層を作成するさまざまな方法を試しました。いくつかは他のものよりもうまくいきましたが、私はいつも「より良い」方法がなければならないと感じていました.
人々がさまざまな状況で DAL を処理したさまざまな方法と、この手法がどのように機能したか、またはうまく機能しなかったかについての意見を知りたいだけです。
私は現在、 Billy McCafferty の NHibernate Best Practices 記事 /多くの Web / WinForms アプリケーションのサンプル コードに大きく依存しています。これは、基本的な NHibernate と TDD を教えるだけでなく、優れた堅実なサンプル アーキテクチャを提供する、素晴らしく書かれた記事です。彼は、彼のアーキテクチャと設計に関する決定の概要を説明しようとしています。
彼は、ドメイン オブジェクトごとに拡張できる汎用の DataAccessObjects を使用して非常に洗練された DAL を作成し、インターフェイスと DAOFactory を使用して BL に非常に疎結合します。特に NHibernate を使用したことがない場合は、最初に BasicSample を確認することをお勧めします。
この記事は NHibernate に大きく依存していますが、一般的なアプローチは他の ORM に合わせて簡単に変更できると思います。
残念ながら、「より良い方法」があるとは思いません。使用する DAL アプローチについては、特定の状況に依存しすぎています。「最新技術」についての優れた議論は、Martin Fowler によるEnterprise Application Architecture のパターンです。
第 10 章「データ ソース アーキテクチャ パターン」では、ビジネス アプリケーションで最も一般的に使用されるパターンのほとんどについて具体的に説明しています。
ただし、一般的には、基本的な保守性と適応性の要件を満たす最も単純なアプローチを使用することが最良の選択であることがわかりました。
たとえば、最近のプロジェクトでは、単純な「Row Data Gateway」だけで十分でした。(これは、CRUD 操作を実行するメソッドを含む、関連するデータベース テーブルごとにクラスを生成したコードにすぎません)。ORM とストアド プロシージャについての際限のない議論はありません。ただ機能し、必要な仕事をうまくこなしました。
よくあるパターンがいくつかあります。「エンタープライズ アーキテクチャのパターン」という本は、これらの良いリファレンスです。
llblgen などの ORM を使用する場合は、セルフサービスまたはアダプターを選択できます。
NHibernate ルート (上記の @Watson からの良い記事リンク BTW) を使用する場合は、codebetter から suvius-flamingo サンプル プロジェクトをチェックアウトすることを強くお勧めします。彼は、MVC と NHibernate の動作を示す非常に優れた簡潔なサンプル プロジェクトを持っています。
これがsuvius-flamingoのリンクです。
[更新] これは有効ではなくなりました。このプロジェクトのデザインが変更されました [/更新]
私たちのオープン ソース プロジェクト Bunian では、ビジネス オブジェクト (コンポーネント全体) がシステムの中核であり、データ アクセス レイヤーを含むすべてがビジネス オブジェクトを中心に展開する必要があると結論付けました。
ビジネス コンポーネントは、必要なものを他のユーザーに指示し、インターフェースを通じてそれを暗示します。たとえば、Business Object PersonにはIRepositoryForPersonというインターフェイス メンバーがあり、このメンバーには、必要に応じて Dependency Injection コンテナーを介してインスタンスが割り当てられます。
詳細については、こちらのブログ投稿を確認してください。
http://www.emadashi.com/index.php/2008/11/data-access-within-business-objects-bunian-design//
ここでBunianのコードをチェックしてください(まだアマチュアですが):
http://www.codeplex.com/Bunian
もちろん、このアプローチでは、データ アクセス セッションのライフ サイクルのような新しいものが出現します (たとえば、NHibernate を使用している場合)。しかし、それは別の質問になると思います:)
これが役に立つことを願っています
SQL にアクセスする DAL を作成することを意味していると仮定します。これは、今日最も一般的な部分であるためです。1つは、SQL に対して DAL を作成する際の最大の問題が ORM 部分である場合です。つまり、OO プログラミングとリレーショナル データベース スキーマの間には基本的なインピーダンスの不一致があります。ORM を作成するための多くの素晴らしい、成功さえした試みがありました。しかし、それらはすべて、その利点である同じ問題に悩まされています。それらは、生成されている基礎となる SQL からユーザーを抽象化します。これが問題である理由は、データベースのパフォーマンスが、システム全体の機能の重要な要素であるためです。多くの (おそらくほとんどの) ORM は、多くの標準クエリのパフォーマンスが優れていないだけでなく、しかし、実際には、パフォーマンスを大幅に低下させる使用パターンを助長します (コレクションを照会するときにループ内でリレーションシップを繰り返しトラバースすることは、一般的な例の 1 つであり、デッドロックの解決を困難にすることは別の例です)。もちろん、ORM API を詳細に学習した後は、通常、これらのパフォーマンスの穴を回避する方法を見つけることができます。
ORM の現状に対する私の現在の見解は、データ アクセスのすべての要点を処理する堅牢なライブラリの効率性を維持しながら、できる限り少ないことを望んでいるということです。言い換えれば、それらはまだ「十分」であるとは考えておらず、バックエンドとして SQL を使用することは決してないかもしれないため、ベアメタル レベルで制御を維持したいと考えており、SQL の記述に取り掛かります。 ORM に関係なく、多くの場合、ためらうことなく手を差し伸べることができます。これは、与えられたニーズに合わせてデータをクエリする具体的な方法を知っているためです。
これは明らかに、ORM を意図したとおりに宗教的に使用する場合よりもコーディングへの脆弱なアプローチであるため、ユニット テスト、SQL インジェクション、関心の適切な分離に関して特に注意を払う必要があります。つまり、要約すると、私はアッシュに同意しますが、それは彼/彼女が私に同意することを意味するものではありません:)