私は、シングルティア,シングルユーザーアプリケーションと協力しています。FluentNHibernateです。複数のスレッドで、時間トリガーと着信ソケット・メッセージ・トリガーによってトリガーされます。私は、リポジトリの各メソッド内ISessionを配置/作成する、または私は多分プログラムから、複数の呼び出しを介してISessionのライフサイクルを維持する必要がある場合は終了し始めることができるかどうかを決定しますどのような要件NHibernateのセッションのライフサイクル。それぞれのリポジトリメソッドの内部で作成/処分するのはどうですか?
?
たとえば、遅延ロードはセッションを維持する必要がありますか?私がlazyloadを使用しない場合、他の何らかの理由で私はセッションを維持する必要がありますか?
は、現在、私のリポジトリ方法は以下のように見えるが、私は間違ったことをやっているのだろうか...
public class ProductRepository
{
public void Delete(Product product)
{
using (ISession session = FNH_Manager.OpenSession())
{
using (ITransaction transaction = session.BeginTransaction())
{
session.Delete(product);
transaction.Commit();
}
}
}
class FNH_Manager
{
private static Configuration cfg;
private static ISessionFactory sessionFactory;
public static void ConfigureSessionFactory()
{
sessionFactory = CreateSessionFactory();
}
public static ISession OpenSession()
{
return sessionFactory.OpenSession();
}
EDIT1:「呼び出しごとにセッションを」処理する 試み:
public class EmployeeRepository
{
public static void Delete(Employee employee)
{
using (ISession session = FNH_Manager.OpenSession())
{
using (ITransaction transaction = session.BeginTransaction())
{
if (Employee.Id != 0)
{
var emp = session.Get(typeof(Employee), employee.Id);
if (emp != null)
{
session.Delete(emp);
transaction.Commit();
}
}
}
}
}
自分自身に苦痛を与えずに、セッションを管理する作業単位を実装するだけです。実際にはコードが少なくなる可能性が高く、アプリケーションが異なるリポジトリから取得された複数のエンティティ間の複雑なやりとりを容易にする必要がある場合は、アプリケーションがさらに複雑になる場合はスケールアップされます。 – Brook
@Brook - セッションはすでに作業単位です。 – Phill
@Phil - それはありますが、自動的に変更のグループをラップするつもりはありません。そのためには、通常、特定のWebまたはwcfリクエストにスコープしたクラスでラップし、その作業ユニットを呼び出します。もう1つは、通常はNHの依存関係を持つアプリケーションの部分を望んでいないため、ラッパーを使用するとそれを切り離すことができます。 – Brook