2012-03-27 11 views
0

私の現在の仕事では、EntityFrameworkとDbContextの上にRepository/UoWパターンを実装しました。特定のORMソリューションに依存したくない場合は、私がこれで見つけた唯一の有効な理由があります。私はちょうど誰かがこれをやったかどうかを見たいと思っていました。プロジェクトの途中で(例えば1年後)、「EntityFrameworkからNHibernateに切り替える必要があるので、私はリポジトリパターンを実装してうれしいです。 " (LINQを使用して)結合の基本的なクエリを除いて、私はデータベースのテーブルを作成し、リポジトリを作成し、サービスを書く必要があるので抽象化のこの余分な層が感じる(典型的な3ティアードアーチ)とコントローラとビューのような必要なフロントエンド。誰かが開発中にORMソリューションを切り替えたことはありますか?

更新:

誰が、なぜ前に、プロジェクトにORM年代を切り替える持っているかどうかを知りたいですか?

答えて

0

これを行う必要はありません。私は実際に切り替えたプロジェクトは認識しておらず、切り替えには実際には多くの作業が含まれます。
Ayende's blogを読むと、リポジトリに対して多くの点があります。

これを行う唯一の理由は、特定のユースケースに基づいていくつかのORMで使用できるフレームワークを開発する場合です。

さらに、テーブルごとのリポジトリを持つことは、開発者の時間が非常に無駄です。
リポジトリを持っていても、エンティティ固有の拡張機能を持つ汎用リポジトリを1つだけ持つだけで十分です。

これまで述べてきたように、私は依然としてリポジトリを使用しています。なぜなら、関係のないコードでサードパーティのライブラリへの直接参照を嫌うからです。しかしこれは好みの問題であり、私が証明できるベストプラクティスではありません。

+0

エンティティモデルが存在する場合、基本的なCRUD操作ユニットでテストされたリポジトリを15〜20分で作成できます。私はそれが時間の無駄だとは思わない。あなたが同意しないなら、私の答えを見てください。 – BentOnCoding

+0

CUD操作では、一般的なリポジトリで十分です。なぜより多くを作成するのですか?読み込みでは、 'IQueryable'を何らかの方法で使用しています。それ以外の場合は、すべてのレイヤーの変更が必要になるためです。 –

+0

リポジトリの複雑さによって異なります。私は一般的なリポジトリの大きなファンです。ほとんどの場合、呼び出しコードでトランザクションスコープを制御し、DBにコミットすることができますが、ときどきコントロールトランザクションスコープのようなものを実行し、すべてのメソッドが自分のDbContextのSaveChanges()を呼び出すとします。これは、一般的なリポジトリが私の要件を満たさない状況です。 – BentOnCoding

0

リポジトリパターンの使用を提案するMicrosoftのブログがたくさんあります。

「仕事のエンティティフレームワーク単位」のこのgoogle検索は、これをバックアップします。

entity framework unit of work

私はそれが保守性と柔軟性だと確信しSOLID原則に従うことであることを確認するために、あなたのコード内でいただきました!より重要だと思います。最も具体的には、界面分離パターン。インターフェイスにコーディングしていた場合、インターフェイスにコーディングするときにデータリポジトリの実装は無関係になります。

は、私は時々、データを保存するためにAzureブロブストレージを使用するので、私は私のインターフェイスの2つの実装があります

IDtoEntityRepository

私は2つの異なるデータストアから同じデータ型を引っ張ってるし、各データストアが持っているのデータを扱うためのさまざまな要件 だから私は1つのSQL実装と1つの紺碧のBLOBストレージの実装に終わる。 SQL実装は、エンティティフレームワークでコーディングすることを起こるが、私は簡単にTelerikのORMを使用して新しいクラスのコードをコーディングすることができ呼ば:

TelerikOrmDtoEntityRepository 

をIDtoEntityRepositoryに対してコーディングされたすべてのクラスが実装を気にしないでください。これを行うことで、データ層の実装の詳細を呼び出しコードから切り離しました。

+0

**注:リンクされたGoogle検索は、このパターンがまだMicrosoftによって推奨されており、無関係ではないことを示すために、過去1年間にフィルタリングされています。フィルタなしの検索では2009年の結果が示されました。結果に表示された記事は古くなっており、無関係です。 – BentOnCoding

+0

良い点。異なる永続ストアを持つ特別なORMまたは接続インタフェースが必要な場合は、これが便利です。 ここに追加するもう1つの例は、NoSQLソリューションです。これは、本当にどこに格納されているのかを隠しておきたい場合に適しています。あなたはそのオプションを望んでいます。 – jschell12

0

高速テスト済みで信頼性の高い機能コードを提供するために必要な最小限のオブジェクトを作成するだけです。その後、リファクタリングなどを気にするかもしれませんし、ある日、ORMツールの変更を決めると、レポジトリや作業単位デザインパターンなどのメカニックで手を汚してしまいます。

さらに、リポジトリパターンがすでに快適な場合は、ORMツールを変更するだけでなく、特定の条件下でADO.NETを使用する可能性があるため、その有用性を予見することをお勧めします状況。

ORMなどのサードパーティのツールに依存するのは悪くないと思うし、最高の評価を得たいと思っています。つまり、NHibernateです。存在する他のORMツールこれは個人的な意見です。

私が言っていることの背後にある考え方は、あなたがいつかそれらを必要とするかもしれない場合に備えて、たくさんのクラスを書くことではありません。あなたが実際にそれらを必要とするときにそれらを書く。

+0

YAGNI。現在、私はレガシーシステムで作業していませんし、他の外部永続ストアを追加する予定もありません。また、SQL Serverを使用するよりも有用であると判明すれば、BLOBストレージの可能性が高くなります。 その場合、私が実際にどのような永続ストアに接続しているか知りたいかもしれません。もう1つの理由はトランザクションを処理することです。複数のマッピングツールを混在させていると、これは難しくなります。 – jschell12

関連する問題