Winforms と WPF で NHibernate を使用して数年経った今でも、非常に重要なポイントを 1 つ見落としているように思われます。このコード スニペットを実行すると明らかになりすぎました。
ISessionFactory sf = Fluently.Configure()
.Database(MsSqlConfiguration.MsSql2008
.ConnectionString(c => c.Is(connectionString)))
.Mappings(x => x.FluentMappings
.AddFromAssemblyOf<MyClass>())
.BuildSessionFactory();
for (int i = 0; i < 100; i++)
{
new Task(()=>
{
Console.WriteLine("{0}, {1}",
i,
sf.OpenSession().QueryOver<MyClass>().List().Count);
}).Start();
}
これにより、多くの負荷がかかると思います。
正直なところ、セッション処理について読んだ記憶があるのは、原子セッションを宣言する Unit Of Work の実装だけです。それで、パターンを見て、いくつかの懸念/質問があります。
遅延読み込みはどのように図に収まりますか? 1 つのセッションを使用してデータをロードしてから閉じると、遅延ロードが機能しません。したがって、基本的に、作業単位はセッションを閉じたり破棄したりできません。つまり、セッションは無限に大きくなります。
セッションには次のような機能があります
IsDirty
。オブジェクトの読み込みと保存が別々のセッションで行われる場合、これをどのように利用できますか?
編集: Oren Eini は、彼の初期の記事で問題とまったく同じことを述べています。そこで彼は、MicroManaging (=> use and immediate Dispose
) が LazyLoading や ChangeTracking などの NH 機能を遮断すると述べています。ただし、UnitOfWork は Session MicroManagement パターンのようです。では、最もクリーンなソリューションは何ですか? 自分で変更を追跡し、MicroManagement を使用していますか? モノリシック セッション (= 設計による Memleak)? Oren の例とは異なり、セッションの有効期間を制限できるサブダイアログが多くない場合はどうでしょうか?