0

nhibernate を使用する Web サービスがあります。リポジトリ ライブラリにシングルトン パターンがありますが、サービスを呼び出すたびに、非常にコストのかかるセッション ファクトリの新しいインスタンスが作成されます。私に何ができる?

    #region Atributos

    /// <summary>
    /// Session
    /// </summary>
    private ISession miSession;

    /// <summary>
    /// Session Factory
    /// </summary>
    private ISessionFactory miSessionFactory;
    private Configuration miConfiguration = new Configuration();
    private static readonly ILog log = LogManager.GetLogger(typeof(NHibernatePersistencia).Name);

    private static IRepositorio Repositorio;

    #endregion

    #region Constructor

    private NHibernatePersistencia()
    {
        //miConfiguration.Configure("hibernate.cfg.xml");
        try
        {
            miConfiguration.Configure();
            this.miSessionFactory = miConfiguration.BuildSessionFactory();
            this.miSession = this.SessionFactory.OpenSession();
            log.Debug("Se carga NHibernate");

        }
        catch (Exception ex)
        {
            log.Error("No se pudo cargar Nhibernate " + ex.Message);
            throw ex;
        }

    }

    public static IRepositorio Instancia
    {
        get
        {
            if (Repositorio == null)
            {
                Repositorio = new NHibernatePersistencia();
            }
            return Repositorio;
        }
    }

    #endregion

    #region Propiedades

    /// <summary>
    /// Sesion de NHibernate
    /// </summary>
    public ISession Session
    {
        get { return miSession.SessionFactory.GetCurrentSession(); }
    }

    /// <summary>
    /// Sesion de NHibernate
    /// </summary>
    public ISessionFactory SessionFactory
    {
        get { return this.miSessionFactory; }
    }

    #endregion

すべてのサービスに対して単一のインスタンスを作成するにはどうすればよいですか?

4

1 に答える 1

1

あなたはすでに解決策について言及したと思います。Sessionfactory-Provider にはシングルトンを使用する必要があります。個人的には、Spring を使用して ApplicationContext を管理し、オブジェクトを配線することを好みますが、その必要はありません。NHibernatePersistencia-Object を Service としてではなく、SessionProvider として使用するだけで問題ありません。

サービスは次のようになります。

public class YourService : IYourService
{
    public User GetUsers(int id)
    {
        using(NHibernatePersistencia.OpenSession())
        {
            return session.Load(typeof(user), id);
        }
    }      
}

...そして、SessionProvider の場合は、リクエストごとに常に新しいセッションを開くことをお勧めします。長期セッションはゆっくりと成長しています。Web サービス内の複数のユーザーを考慮すると、これは良い考えではないようです。

public class NHibernatePersistencia
{
    /* ...  */
    public ISession OpenSession()
    {
        return this.SessionFactory.OpenSession();
    }
    /* ...  */
}

シンプルですが、うまくいくはずです。このnhibernate.info exampleを見てみたいと思うかもしれません。そこにある NHibernateHelper は、NHibernatePersistencia-Class とほとんど同じです。

于 2011-01-14T21:50:18.563 に答える