1

私は自分の問題を解決しようとたくさん読んでいるので、この件に関するいくつかのトピックが議論されていることを知っていますが、どういうわけか、それらは私のニーズを満たしていません (おそらく詳細がないため)。とにかく、特定の「トピック」が役立つと思われる場合は、リンクしてください。

私は WPF (および MVVM) を使用してデスクトップ アプリケーションを開発しており、NHibernate を使用しています。セッションを管理する方法について調査した結果、セッションごとのアプローチを使用することにしました。これで、遅延読み込みやキャッシュなどの NHibernate の機能を十分に活用できると思います。データベースで作業しているので、エンティティの読み込み中または保存中に UI をフリーズさせたくないので、(各フォームで、開発を簡素化すると思う) 専用のスレッドを使用する必要があると考えました。データベースのやり取りを処理します。ただし、問題は、「データベース呼び出し」を行うためにスレッドを「再利用」する方法です (そのスレッドに関連付けられたセッションがあると仮定します)。

  • 2 つのタスクが同じスレッドで実行されることが保証されていないため、TPL を使用できなかったと思います (呼び出し側とは異なるスレッドで実行されることさえ保証されていません)。
  • session-per-conversation などを使用して終了する同様の議論を見たので、session-per-form を使用することを好みます。とにかく、会話ごとのセッションの方が良いと思われる場合は、教えてください (できれば理由も説明してください)。
  • スレッドは複数のメソッドを直接実行する方法を提供しないため、リクエストを「リッスン」する必要があると思いますが、本当にこれを行う必要があるかどうか、およびセッションをどのように「使用」するかはまだわかりません(そして保存します)スレッド内のみ。

編集:スレッドセーフを他のものと混同しているため、この問題が発生している可能性があります。NHibernate のドキュメントに ISession インスタンスはスレッドセーフではないと書かれている場合、2 つのスレッドが同時にそれを使用しようとすると、問題が発生する (または発生する可能性がある) ということですか? 私の場合、TPL を使用すると、異なるスレッドが同じセッションを使用できますが、同じセッションで同時に複数の操作を実行することはありません。それで、その状況で私は困るでしょうか?

4

1 に答える 1

0

私が提案するかもしれませんが、デスクトップアプリケーションはデータベースと直接対話するのにはあまり適していません。通信は暗号化されておらず、ほんの少しのノウハウさえあれば、データベースのパスワードを取得し、SQL接続を使用してレコードをいじり始め、データベースを破壊するのは非常に簡単です。

デスクトップアプリケーションとデータベースの間にある認証を使用してWebサービスを作成することをお勧めします。これは、各個人の資格情報を作成でき、すべてのトランザクションがさまざまなビジネスルールに強制的に適用されるためです。

これにより、セッション管理に関する問題がほとんどまたはまったく発生せずに別のスレッドでHTTP接続を作成できるため、スレッドの問題も解決されます。必要なのはCookieの値だけである可能性が高く、RestSharpを使用するとこれは非常に簡単です。

于 2012-12-15T21:56:13.867 に答える