Помогите понять этот фрагмент кода управления сессиями nhibernate - PullRequest
1 голос
/ 12 сентября 2011

Это основано на: http://nhforge.org/blogs/nhibernate/archive/2011/03/03/effective-nhibernate-session-management-for-web-apps.aspx

Код здесь: https://gist.github.com/852307

Мои вопросы в DAO:

//Example of dao
public class Dao<T> : IDao<T>
{
    private readonly ISessionFactory sessionFactory;

    public Dao(ISessionFactory sessionFactory)
    {
        this.sessionFactory = sessionFactory;
    }

    public void Save(T transient)
    {
        sessionFactory.GetCurrentSession().Save(transient);
    }
}

Я думаю,ISessionFactory get автоматически подключается с использованием правильного windsor?

public class NHibernateInstaller : IWindsorInstaller
{
    #region IWindsorInstaller Members

    public void Install(IWindsorContainer container, IConfigurationStore store)
    {
        container.Register(Component.For<ISessionFactory>()
                               .UsingFactoryMethod(k => BuildSessionFactory()));

        container.Register(Component.For<NHibernateSessionModule>());

        container.Register(Component.For<ISessionFactoryProvider>().AsFactory());

        container.Register(Component.For<IEnumerable<ISessionFactory>>()
                                    .UsingFactoryMethod(k => k.ResolveAll<ISessionFactory>()));

        HttpContext.Current.Application[SessionFactoryProvider.Key]
                        = container.Resolve<ISessionFactoryProvider>();
    }

    #endregion
    public ISessionFactory BuildSessionFactory() { ... }
}

Но в DAO при вызове метода:

sessionFactory.GetCurrentSession()

Как работает этот фрагмент и HttpModule, открывающий сеанс?

Я не вижу, как GetCurrentSession () подключается к сеансу, который был открыт HttpModule, поскольку GetCurrentSession является встроенным методом?

1 Ответ

2 голосов
/ 12 сентября 2011

Используются контекстные сеансы NHibernate:
http://www.nhforge.org/doc/nh/en/index.html#architecture-current-session

Вся магия происходит в LazySessionContext .Каждый раз, когда вызывается метод связывания, он сохраняет сеанс в nhibernate context .В вашем случае контекстом будет LazySessionContext , который представляет собой пользовательский контекст (наследующий от ICurrentSessionContext NH), используемый этим приложением.В версии 3.2 nhibernate есть 4 или 5 различных типов стандартных контекстных сеансов.

Метод GetCurrentSession в основном извлекает сохраненный (сохраненный сеанс в вызове bind) сеанс NH из более раннего.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...