私はNHibernateを初めて使用しますが、EF4に精通しています。
新しい会社の新しいビジネスアプリでは、ASP.NET WebフォームとNHibernateを使用するように指示されており、開始することを検討しています。私は物事を素晴らしくシンプルに保ち、物事を次のように構成することを計画していました。
- ビジネス層メソッドの呼び出しのコードビハインド
- ユニットテストを容易にするために、コンストラクターで「IRepository」参照を取得するビジネス層クラス
- DTO/DTOのコレクションを返すリポジトリメソッドを呼び出すビジネス層クラス
- リポジトリは、NHibernateのものをすべて非表示/カプセル化します。
セッション/トランザクションの管理に関しては、思ったほど簡単ではありませんでした:)
セッション:このアプローチ(Application_BeginRequest
およびApplication_EndRequest
global.asaxを使用)は最も簡単な方法のように見えます(私は思いますか?)...しかし、私はNHibernateコードをUI層に配置する必要があるとは思っていませんでした。
次に、これらのセッションの使用方法.....
この「ベストプラクティス」の記事は、すべてのNHibernateデータアクセス(読み取りも含む)にこのパターンを使用することを提案しています。
using (ITransaction tx = Session.BeginTransaction())
{
// execute a query, before an update, etc
tx.Commit();
}
だから私の質問は:
- 私のリポジトリでは、このアプローチで提案されているように、現在のNHibernateセッションをHttpContextから取得できますか(そして取得する必要がありますか?)?UIに非常に依存しているため、私には正しくないようです。
(ただし、他の場所で使用されているように、NHibernateオブジェクトを適切なコンストラクターに渡すよりも良いように思えISession
ます。つまり、私の場合は、UIからビジネス層コンストラクターに渡す必要があります。リポジトリコンストラクターまで....そして、UIとビジネス層がNHibernateを認識しないことを望んでいました。)
私の状況では、すべての読み取りをトランザクションでラップする必要がありますか?
「NHibernate」トランザクションは「」トランザクションと何か違いがあり
System.Transactions
ますか?