0

私はNHibernateを初めて使用しますが、EF4に精通しています。

新しい会社の新しいビジネスアプリでは、ASP.NET WebフォームとNHibernateを使用するように指示されており、開始することを検討しています。私は物事を素晴らしくシンプルに保ち、物事を次のように構成することを計画していました。

  • ビジネス層メソッドの呼び出しのコードビハインド
  • ユニットテストを容易にするために、コンストラクターで「IRepository」参照を取得するビジネス層クラス
  • DTO/DTOのコレクションを返すリポジトリメソッドを呼び出すビジネス層クラス
  • リポジトリは、NHibernateのものをすべて非表示/カプセル化します。

セッション/トランザクションの管理に関しては、思ったほど簡単ではありませんでした:)

セッション:このアプローチApplication_BeginRequestおよびApplication_EndRequestglobal.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ますか?

4

1 に答える 1

2

ある意味で、BeginRequest()/ EndRequest()は実際にはUIコードではなく、その特定のスタイルのアプリケーションで「リクエスト」がどのように処理されるかに続く「アプリケーションフレームワークのようなもの」です。ネイティブWindowsアプリケーションなどで同じビジネス層を再利用する場合は、セッションを別の方法で処理する必要があるため、これをある種のデータレイヤーで完全に非表示にすることは必ずしも良い考えではありません。

リクエストごとにアクティブなセッションを追跡するには、コンテキストセッションに対するNHibernateのサポートを使用する必要があります。あなたの場合、WebSessionContext。http://nhibernate.info/doc/nh/en/index.html#architecture-current-session(ManagedWebSessionContextを忘れて、非推奨になりました。)これに続いて、ビジネス/データレイヤーはsessionFactory.GetCurrentSession(からセッションを取得します。 )、UIコードに依存しません。

Global.asaxのアプリケーションセットアップコードを除いて、UIはおそらくNHをほとんど認識していないはずです。独自のIHttpModuleに移動することもできます。もちろん、本当に必要な場合は、MyDataLayer.StartSession()の背後に非表示にすることができます。

常にトランザクションを使用する必要があります。定義しないことで何が得られますか?データベースは引き続き(複数の)暗黙のトランザクションを使用します。

NHibernateトランザクションとSystem.Transactionは異なります。TransactionScopeを使用できますが、その場合は、いくつかの問題を回避するためにNHのトランザクションも使用する必要があります。

于 2012-11-04T11:35:11.117 に答える