良い質問。私も数日前にそれらについて考えていました。
実際、NHibernate 3.0 alpha (または現在のトランク) を試してみてください。その新しい LINQ プロバイダーは以前のものよりもはるかに優れています。(これまでのところ、機能していない方法は 1 つしか見つかりませんでしたが、デフォルトでサポートされていない方法に遭遇した場合は、独自のメカニズムをフックすることができます。) 現在のトランクの使用に (まだ?) 問題はありませんでした。 . http://www.hornget.net/packages/サイトで「ナイトリー」ビルドと、それに対する FluentNHibernate ビルドを見つけることができます。Fluent の使い方を知っていれば、生産性が大幅に向上します。SO コミュニティもそれを助けてくれました。
ビジネス層が NHibernate に直接依存していても構わない場合、またはこの種の抽象化を行わなくても保守可能な小さなアプリケーションを作成している場合は、リポジトリ パターンを使用しなくても問題ありません。ただし、正しく行えば、冗長なコーディングを大幅に削減できます。
それを抽象化する理由は、後で NHibernate を別の ORM に置き換えることができるという理由だけではありませんが、懸念の分離と呼ばれる概念のために良い習慣です。ビジネス ロジック層は、処理するデータへのアクセス方法を気にしたり、知ったりする必要はありません。これにより、アプリケーションまたはそのさまざまなレイヤーの保守が容易になり、チームワークも容易になります。X がデータ アクセス レイヤーを作成し、Y がビジネス ロジックを作成する場合、お互いの作業を詳細に知る必要はありません。
を公開することIQueryable<T>
は非常に良い考えであり、それはまさに多くのリポジトリ実装が現在行っていることです。(私もそうですが、私はそれを静的クラスで作成することを好みました。) もちろん、必要に応じて、エンティティを挿入または更新するためのメソッド、またはトランザクションを開始およびコミットするためのメソッドをいくつか公開する必要があります。(BeginTransaction はIDisposable
、NHibernate インターフェースのリークを避けるために を返すだけで十分です。)
私はあなたにいくつかの指示を与えることができます.SharpArchitectureまたはFubuMVC Contribの実装をチェックして、それを正しく行う方法についていくつかのアイデアを得ることができます.これが私が解決した方法です.