2011-04-26 12 views
10

DAOデータアクセスオブジェクトは.NETでよく使用されるパターンですか?私はデータレイヤーへのアクセスを提供する手段として常にDAOを使用してきました。たとえば、IObjectSetとしてすべてのObjectSetsを公開しているEntityFramework ObjectContextに対して、シン・インタフェースを使用している可能性があります。.NETでDAOパターンが広く使用されていますか?

複雑なクエリは、それぞれがこのインターフェイスに依存するDAOによって公開されます。私はGetProductsOnSale()またはGetInfrequenlySoldProducts()のようなメソッドを公開するProductDAOを持っているかもしれません。私のコントローラやプレゼンターは、これらのメソッドを使用します。これは、単体テストの特定の結果をスタブすることを可能にするためにはおそらくバーチャルになります。

これは.NETでよく使用されるイディオムですか?なんらかの理由で、私がこのパターンを使ってオンラインで見る例の圧倒的多数は、Javaに基づいています。 DAOのベストプラクティスでさえもthis questionにはC#ではなくJavaとしてタグが付けられます。別のコミュニティから何かを使うことには何も問題はありません

、私はちょうど私の周りに誰もが違ったことをやっているというわずかな恐怖を持っている...

答えて

8

それは.NETの一般的なイディオムです。私はそれを使用し、それが多くの場所で使用されているのを見ました。

System.Data名前空間を参照するフレームワークに組み込まれています。クラスの多くは特殊なプロバイダ(SQL Server、Oracle、MySQLなど)の基本クラスであり、操作は基本クラスで実行されます。

しかし、Data Access Objectsの使用だけでなく、​​のように聞こえてきます。

これは多くのプロジェクトでも使用されていますが、フレームワークには組み込まれていません。

+0

私の理解では、リポジトリはすべてのIObjectSet メンバを公開する「もの」であり、DAOはリポジトリを使ってクエリを構築するクラスです。それはあなたがそれらの用語の使い方と一貫していますか? –

+1

@Adam - 実際には 'DAO'は実際のDBインターフェースとは何ですか、'リポジトリ 'は' DAO'の使用を抽象化して "メモリ内"コレクションを表現するものです。 – Oded

+0

私は参照してください。リポジトリのインスタンスを取得し、複雑なクエリを公開するオブジェクトは何と呼びますか?確かにあなたのリポジトリにおそらく数多くのすべての質問を投げ捨てるのは良い考えではありません...私は物事がかなり素早く複雑になっていると想像します –

1

私はDAOパターンを広く使用しています。

あなたはEntity Frameworkについて言及しました。 DAOがDataSetsやDataTablesよりも優れていると私は付け加えました.DatSetやDataTablesはデータベースに似ていて、私の好みのオブジェクトのように不十分です。たとえば、複数のデータテーブルにDataRowsを追加することはできないため、ロードされたデータのサブセットを別のオブジェクトに渡すことはできません。 (つまり、DataRowはDataTable内にあるはずですが、一度に1つのDataTableにしか存在できないようです)。DataRowViewは厄介で、エンティティオブジェクトを別のリストに追加するほど直感的ではありません。

1

データアクセスをカプセル化するためのリポジトリパターン(実際には非常に良いパターンです)の使用に関する私の最大の推奨事項は、汎用リポジトリを作成できることです。しかし、非常にスマートな汎用リポジトリを作成すると、すべての標準CRUD操作に即座にアクセスできるようになり、複雑なクエリ構造にアクセスすることができます。ISomeServiceファサードを公開しません。

ジェネリックリポジトリを使用する上で最も重要なことは、コンストラクタインジェクションに基づいており、継承に基づいていないことです。このようにして、SomeServiceを意味のあるビジネスドメインの境界を満たすために必要な多くの汎用リポジトリに依存させるように構成することができます。

私はこのコンセプトに関するブログを書きました。 Creating a common generic and extensible NHiberate Repository version 2。このブログ記事はNHibernateのリファレンスでは特定のものですが、あなたは同じコアコンセプトをとり、ほとんどすべてDAOに適用することができます。

Entity Framework、Linq2Sql、RavenDBのようないくつかのツールでは、非常に洗練されたリポジトリ自体が公開されており、必ずしも追加のラッパーを追加する必要はありません。

関連する問題